在C#中执行Windows Forms应用程序时,表单视图与Windows主题相同。
如何将自己的主题提供给不依赖于Windows主题的应用程序?
答案 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)
你不能轻易做到这一点。您可以使用多种替代方案。
最简单的方法是创建自己的Skin XML文件,在其中为应用程序指定自己的颜色,然后通过您创建的类读取它并应用新颜色。这将使事物分离并为将来的变化做好准备。但请注意,您仍然无法更改标题栏的呈现方式以及其他特定于系统的内容,例如X和最大化按钮的外观。
在第1点扩展,您可以将表单创建为无边框,并使用自定义绘画(覆盖OnPaint)和图像创建窗口。这很难实现。您可能希望从Form类继承并创建自己的CustomDrawnForm,您将在整个应用程序中使用它。
使用众多控件库中的一个,例如DevExpress。有些是免费的,有些是昂贵的。
你想要做的事情在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再次成为您的朋友。这个简单的建议对某些人来说显而易见,对我来说非常重要。