如何将自己的主题应用于我的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(); }
你不能轻易做到这一点。 您可以使用多种替代方案。
-
最简单的方法是创建自己的Skin XML文件,在其中为应用程序指定自己的颜色,通过您创建的类读取它并应用新颜色。 这将使事物分离并为将来的变化做好准备。 但请注意,您仍然无法更改标题栏的呈现方式以及其他特定于系统的内容,例如X和最大化按钮的外观。
-
扩展到第1点,您可以将表单创建为无边框,并使用自定义绘制(覆盖OnPaint)和图像创建窗口。 这很难实现。 您可能希望从Form类inheritance并创建自己的CustomDrawnForm,您将在整个应用程序中使用它。
-
使用众多控件库中的一个,例如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再次成为您的朋友。 这个简单的建议对某些人来说显而易见,对我来说是巨大的。
- Windows /.NET的System.Drawing.Save(Stream,ImageFormat)中的错误。 腐败的PNG产生了
- Process.Start()在模拟后抛出“拒绝访问”
- 防止非托管函数指针垃圾回收
- 每个人工创建的代码文件的开头都有文件头注释吗?
- 将toolstripcontrolhost添加到customcontrol
- FieldConverter ConverterKind.Date“dd / MM / yyyy”exception
- 如何从GetTokenInformation()安全地为32位和64位拼接可变长度的结构数组? C#
- 如何使用C#下载并解压缩gzip文件?
- 压缩和解压缩文件和文件夹