如何通过代码绘制自定义进度条 (WPF)
How to paint a custom Progress Bar by code (WPF)
我创建了一个 WinForms 自定义进度条,但它有点闪烁。它是双缓冲的,但它仍然有点闪烁,所以我正在尝试 WPF 看看是否可以消除这种小闪烁。
我对 WPF 完全陌生。据我所知,WPF 的 OnPaint(PaintEventArgs e) 方法称为 OnRender(DrawingContext drawingContext)。
System.Drawing.Image BMP = System.Drawing.Image.FromFile(MyImagePath);
BMP = new Bitmap(BMP, (int)Width, (int)Height);
// Working method I founded in this site for converting a System.Drawing.Bitmap to a BitmapSource
ImageSource Rainbow = CreateBitmapSourceFromGdiBitmap((Bitmap)BMP);
// Working method I founded in this site for converting a System.Drawing.Bitmap to System.Windows.Media.Brush
System.Windows.Media.Brush RainbowBrush = CreateBrushFromBitmap((Bitmap)BMP);
protected override void OnRender(DrawingContext DrawingContext)
{
if (Value > 0)
{
Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
DrawingContext.DrawRectangle(RainbowBrush, new System.Windows.Media.Pen(), myRect);
}
}
问题:
我的图片不是"overriding"绿条。
现在,如果我将 Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
更改为...比方说,Rect myRect = new Rect(0, 50, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
,结果是这样的:
所以,彩虹条被绘制出来了,但没有超过进度条。如果我写 Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
,它会被绘制但在进度条下方。我该怎么做才能拥有彩虹进度条(以及与此相关的其他自定义进度条)?
感谢您的帮助。
编辑: 原来的进度条(那个有点闪烁的)比彩虹多得多。我刚开始使用彩虹在 WPF 中进行快速测试,然后尝试添加其他内容。以防万一,如果您想知道为什么这样一个简单的进度条在 WinForms 中闪烁。这是因为 WinForms 拥有的不仅仅是彩虹。谢谢。
如果您需要在 WPF
应用程序的 Window
开头创建一个 ProgressBar
,可以使用以下代码:
你的xaml:
<Window x:Class="PasswordBoxMVVM.MainWindow"
<!--The code omitted for the brevity-->
Title="MainWindow" Height="350" Width="525">
<StackPanel x:Name="stackPanel">
<TextBox x:Name="textBox"
<DataGrid />
</StackPanel>
</Window>
代码隐藏:
public MainWindow()
{
InitializeComponent();
PaintProgressBar();
}
private void PaintProgressBar()
{
ProgressBar progressBar = new ProgressBar();
progressBar.IsIndeterminate = true;
progressBar.Margin = new Thickness(10, 0, 10, 10);
progressBar.Visibility = Visibility.Visible;
progressBar.Height = 25;
//progressBar.FlowDirection = FlowDirection.LeftToRight;
progressBar.Foreground = System.Windows.Media.Brushes.Green;
progressBar.Background = System.Windows.Media.Brushes.Red;
progressBar.Value = 50;
stackPanel.Children.Add(progressBar);
}
其中 属性 progressBar.Foreground
设置 ProgressBar
的颜色。
我创建了一个 WinForms 自定义进度条,但它有点闪烁。它是双缓冲的,但它仍然有点闪烁,所以我正在尝试 WPF 看看是否可以消除这种小闪烁。
我对 WPF 完全陌生。据我所知,WPF 的 OnPaint(PaintEventArgs e) 方法称为 OnRender(DrawingContext drawingContext)。
System.Drawing.Image BMP = System.Drawing.Image.FromFile(MyImagePath);
BMP = new Bitmap(BMP, (int)Width, (int)Height);
// Working method I founded in this site for converting a System.Drawing.Bitmap to a BitmapSource
ImageSource Rainbow = CreateBitmapSourceFromGdiBitmap((Bitmap)BMP);
// Working method I founded in this site for converting a System.Drawing.Bitmap to System.Windows.Media.Brush
System.Windows.Media.Brush RainbowBrush = CreateBrushFromBitmap((Bitmap)BMP);
protected override void OnRender(DrawingContext DrawingContext)
{
if (Value > 0)
{
Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
DrawingContext.DrawRectangle(RainbowBrush, new System.Windows.Media.Pen(), myRect);
}
}
问题:
我的图片不是"overriding"绿条。
现在,如果我将 Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
更改为...比方说,Rect myRect = new Rect(0, 50, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
,结果是这样的:
所以,彩虹条被绘制出来了,但没有超过进度条。如果我写 Rect myRect = new Rect(0, 0, ((Width * Value) / (Maximum - Minimum)) + 5, Height);
,它会被绘制但在进度条下方。我该怎么做才能拥有彩虹进度条(以及与此相关的其他自定义进度条)?
感谢您的帮助。
编辑: 原来的进度条(那个有点闪烁的)比彩虹多得多。我刚开始使用彩虹在 WPF 中进行快速测试,然后尝试添加其他内容。以防万一,如果您想知道为什么这样一个简单的进度条在 WinForms 中闪烁。这是因为 WinForms 拥有的不仅仅是彩虹。谢谢。
如果您需要在 WPF
应用程序的 Window
开头创建一个 ProgressBar
,可以使用以下代码:
你的xaml:
<Window x:Class="PasswordBoxMVVM.MainWindow"
<!--The code omitted for the brevity-->
Title="MainWindow" Height="350" Width="525">
<StackPanel x:Name="stackPanel">
<TextBox x:Name="textBox"
<DataGrid />
</StackPanel>
</Window>
代码隐藏:
public MainWindow()
{
InitializeComponent();
PaintProgressBar();
}
private void PaintProgressBar()
{
ProgressBar progressBar = new ProgressBar();
progressBar.IsIndeterminate = true;
progressBar.Margin = new Thickness(10, 0, 10, 10);
progressBar.Visibility = Visibility.Visible;
progressBar.Height = 25;
//progressBar.FlowDirection = FlowDirection.LeftToRight;
progressBar.Foreground = System.Windows.Media.Brushes.Green;
progressBar.Background = System.Windows.Media.Brushes.Red;
progressBar.Value = 50;
stackPanel.Children.Add(progressBar);
}
其中 属性 progressBar.Foreground
设置 ProgressBar
的颜色。