如何将自己的主题应用于我的Windows窗体应用程序?

时间:2010-11-03 12:54:27

标签: c# .net winforms

在C#中执行Windows Forms应用程序时,表单视图与Windows主题相同。

如何将自己的主题提供给不依赖于Windows主题的应用程序?

4 个答案:

答案 0 :(得分:3)

覆盖OnPaint方法并绘制您想要的任何内容。 :)

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;

    SolidBrush brush = new SolidBrush(Color.Black);
    float percent = (float)(val - min) / (float)(max - min);
    Rectangle rect = this.ClientRectangle;

    rect.Width = (int)((float)rect.Width * percent);

    g.FillRectangle(brush, rect);

    brush.Dispose();
    g.Dispose();
}

答案 1 :(得分:2)

你不能轻易做到这一点。您可以使用多种替代方案。

  1. 最简单的方法是创建自己的Skin XML文件,在其中为应用程序指定自己的颜色,然后通过您创建的类读取它并应用新颜色。这将使事物分离并为将来的变化做好准备。但请注意,您仍然无法更改标题栏的呈现方式以及其他特定于系统的内容,例如X和最大化按钮的外观。

  2. 在第1点扩展,您可以将表单创建为无边框,并使用自定义绘画(覆盖OnPaint)和图像创建窗口。这很难实现。您可能希望从Form类继承并创建自己的CustomDrawnForm,您将在整个应用程序中使用它。

  3. 使用众多控件库中的一个,例如DevExpress。有些是免费的,有些是昂贵的。

  4. 你想要做的事情在Windows.Forms中并不是很简单,也许你应该看看WPF和其他替代方案。

答案 2 :(得分:1)

这取决于你对主题的意图;正如汉斯在评论中所说,通常使用系统的“主题”来控制和窗口外观被认为是一种资产。

但是,对于应用程序中的主题元素 - 例如标题面板或标题字体颜色等的背景然后我将构建一个界面,其中包含应用程序中颜色/图像的定义(例如ITheme),然后使用常规数据绑定在运行时适当地配置它们ITheme已设置。

public interface ITheme
{
    string Name { get; }
    Image Logo { get; }
    String BrandText1 { get; }
    String BrandText2 { get; }
    Image BrandBannerLogo { get; }
    Color BrandPanelText_Left { get; }
    Color BrandPanelText_Centre { get; }
}

事实上,您可以更进一步......例如,在我们的应用程序中,我们还定义了IThemeManager

public interface IThemeManager : INotifyPropertyChanged
{
    event EventHandler CurrentThemeChanged;
    ITheme CurrentTheme { get; set; }
    Dictionary<string, ITheme> AvailableThemes { get; }
}

我们允许ThemeManager被依赖注入,然后我们在控件中绑定它的Current属性:

    [Dependency]
    public IThemeManager ThemeManager
    {
        get { return _themeManager; }
        set
        {
            if (_themeManager != value)
            {
                _themeManager = value;
                if (_themeManager != null && !DesignMode)
                {
                    _headerPanelBackgroundImageBinding = themePanel.DataBindings.Add("BackgroundImage", ThemeManager, "CuurentTheme.Logo", false, DataSourceUpdateMode.Never);
                }
                else
                {
                    // Reset to the default
                    this.DataBindings.Remove(_headerPanelBackgroundImageBinding);
                }

                Invalidate();
            }
        }
    }

答案 3 :(得分:0)

我知道这个问题相当陈旧,但对于那些(就像我一样)仍然有兴趣创造真正的&#34;主题&#34; Windows窗体,如上所述,WPF非常适合创建主题。还有相当多的预先创建的主题(Google和stackoverflow始终是您的朋友)可供下载。 Windows Forms项目世界可能有一点学习曲线,但恕我直言也非常值得。但是,如果您希望使用普通的Windows窗体应用程序(就像我一样),最简单的建议是创建无边框窗体(将FormBorderStyle设置为None)。这将保留大多数标准的Windows容器属性。当然,你需要创建自己的&#34;主题&#34; TitleBar和边框,但这主要是&#34;主题&#34;一个Windows窗体是。您还需要创建自己的大小调整和移动方法,但Google和stackoverflow再次成为您的朋友。这个简单的建议对某些人来说显而易见,对我来说非常重要。