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

在C#中执行Windows窗体应用程序时, 窗体的视图看起来与Windows的主题相同。

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

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

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

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

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

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

但是,对于应用程序中的主题元素 – 例如标题面板的背景或标题字体颜色等,然后​​我将构建一个界面,其中包含应用程序中颜色/图像的定义(例如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 AvailableThemes { get; } } 

我们允许ThemeManager被dependency injection,然后我们在控件中绑定它的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(); } } } 

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