C# WinForms到WPF迁移

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

我发现了一个程序,正在尝试将它从C#移植到WPF,到目前为止我做得很好,但是我在UserControl方面有一个问题。我无法将其转换为WPF,因为我的知识有限。在C#上,我们使用了OnPaint,在WPF OnRender上,我不知道如何在WPF中实现相同的UserControl 代码如下:

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();
    }
}