C# WinForms到WPF迁移
我发现了一个程序,正在尝试将它从C#移植到WPF,到目前为止我做得很好,但是我在UserControl方面有一个问题。我无法将其转换为WPF,因为我的知识有限。在C#上,我们使用了OnPaint,在WPF OnRender上,我不知道如何在WPF中实现相同的UserControl 代码如下:C# WinForms到WPF迁移,c#,wpf,winforms,xaml,user-controls,C#,Wpf,Winforms,Xaml,User Controls,我发现了一个程序,正在尝试将它从C#移植到WPF,到目前为止我做得很好,但是我在UserControl方面有一个问题。我无法将其转换为WPF,因为我的知识有限。在C#上,我们使用了OnPaint,在WPF OnRender上,我不知道如何在WPF中实现相同的UserControl 代码如下: public partial class DownloadBar : UserControl { public DownloadBar() { InitializeCompo
public partial class DownloadBar : UserControl
{
public DownloadBar()
{
InitializeComponent();
}
public enum DownloadBarState
{
Setup,
Available,
Playable
}
protected double percent = 0.0f;
[Category("Download Bar Properties")]
[DefaultValue(true)]
public double Value
{
get
{
return percent;
}
set
{
if (value < 0)
value = 0;
else if (value > 100)
value = 100;
percent = value;
this.Invalidate();
}
}
protected DownloadBarState dBarState = DownloadBarState.Setup;
[Category("Download Bar Properties")]
public DownloadBarState BarState
{
get
{
return dBarState;
}
set
{
dBarState = value;
this.Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
switch (dBarState)
{
case DownloadBarState.Setup:
g.DrawImage(Properties.Resources.dbar_setup, 0, 0);
g.DrawImage(Properties.Resources.red_progressbar, 5, 35, (int)((Value / 100) * this.Width), 10);
break;
case DownloadBarState.Available:
g.DrawImage(Properties.Resources.dbar_available, 0, 0);
g.DrawImage(Properties.Resources.yellow_progressbar, 5, 35, (int)((Value / 100) * this.Width), 10);
break;
case DownloadBarState.Playable:
g.DrawImage(Properties.Resources.dbar_playable, 0, 0);
g.DrawImage(Properties.Resources.DownloadProgressBarGreen, 5, 35, (int)((Value / 100) * this.Width), 10);
break;
}
}
}
public部分类下载栏:UserControl
{
公共下载栏()
{
初始化组件();
}
公共枚举下载状态
{
设置,
可用,
可玩
}
保护双百分比=0.0f;
[类别(“下载栏属性”)]
[默认值(真)]
公共双重价值
{
得到
{
收益率;
}
设置
{
如果(值<0)
数值=0;
否则,如果(值>100)
数值=100;
百分比=价值;
这个。使无效();
}
}
受保护的DownloadBarState dBarState=DownloadBarState.Setup;
[类别(“下载栏属性”)]
公共下载BarState BarState
{
得到
{
返回dBarState;
}
设置
{
dBarState=值;
这个。使无效();
}
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
图形g=e.图形;
开关(dBarState)
{
案例下载BarState。安装程序:
g、 DrawImage(Properties.Resources.dbar_设置,0,0);
g、 DrawImage(Properties.Resources.red_progressbar,5,35,(int)((Value/100)*this.Width),10);
打破
案例下载BarState。可用:
g、 DrawImage(Properties.Resources.dbar_可用,0,0);
g、 DrawImage(Properties.Resources.yellow_progressbar,5,35,(int)((Value/100)*this.Width),10);
打破
案例下载状态。可播放:
g、 DrawImage(Properties.Resources.dbar_可播放,0,0);
g、 DrawImage(Properties.Resources.DownloadProgressBarGreen,5,35,(int)((Value/100)*this.Width),10);
打破
}
}
}
这是第二部分:
public partial class DownloadProgressBar : UserControl
{
public DownloadProgressBar()
{
InitializeComponent();
}
public enum ProgressBarColor
{
Green,
Blue,
Red,
Yellow
}
protected double percent = 0.0f;
[Category("Behavior")]
[DefaultValue(true)]
public double Value
{
get
{
return percent;
}
set
{
if (value < 0)
value = 0;
else if (value > 100)
value = 100;
percent = value;
progressBarPictureBox.Size = new Size((int)((value / 100) * this.Width), this.Height);
this.Invalidate();
}
}
public void DownloadColor(ProgressBarColor color)
{
switch (color)
{
case ProgressBarColor.Green:
progressBarPictureBox.BackgroundImage = Properties.Resources.DownloadProgressBarGreen;
break;
}
}
}
public分部类DownloadProgressBar:UserControl
{
公开下载ProgressBar()
{
初始化组件();
}
公共枚举颜色
{
绿色
蓝色
红色
黄色的
}
保护双百分比=0.0f;
[类别(“行为”)]
[默认值(真)]
公共双重价值
{
得到
{
收益率;
}
设置
{
如果(值<0)
数值=0;
否则,如果(值>100)
数值=100;
百分比=价值;
progressBarPictureBox.Size=新大小((int)((值/100)*此.Width),此.Height);
这个。使无效();
}
}
公共void下载颜色(ProgressBarColor)
{
开关(彩色)
{
案例颜色:绿色:
progressBarPictureBox.BackgroundImage=Properties.Resources.DownloadProgressBarGreen;
打破
}
}
}
阅读了关于Invalidate的文章,WPF中没有这样的选项,谷歌也搜索了WPF OnRender,但仍然不知道如何做到这一点。非常感谢您的帮助
下面是一些我想要实现的截图
您可以创建一个WPF用户控件,其外观如下(实际样式由您决定):
在本例中,SetupStage是一个int,表示您所处的设置状态。它也可以是一个枚举。
C#到WPF
这是什么意思?@EZI LOL。。。我认为OP对WPF来说意味着winforms。是的,编辑过的主题标题。C#是一种语言。您真正的意思是从winforms
(在.NET2.0时代是一个不推荐使用的UI框架)迁移到WPF。看见基本上,您需要删除所有可怕的代码并使用适当的数据绑定。@edtheprogrammarguy这个答案在很多方面都是误导性的。只要说“坚持表单”,答案就是给人一种印象,即winforms实际上是可用的,并且是.NETUI的有效选择,而它显然不是。
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="10"/>
</Style>
</StackPanel.Resources>
<TextBlock Visibility="{Binding Path=SetupStage, Converter={StaticResource StageToVisibilityConverter}, ConverterParameter=1}">Setup</TextBlock>
<TextBlock Visibility="{Binding Path=SetupStage, Converter={StaticResource StageToVisibilityConverter}, ConverterParameter=2}">Available</TextBlock>
<TextBlock Visibility="{Binding Path=SetupStage, Converter={StaticResource StageToVisibilityConverter}, ConverterParameter=3}">Playable</TextBlock>
</StackPanel>
public class StageToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((int)value == (int)parameter)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}