【问题标题】:C# Application wide color managementC# 应用程序范围的颜色管理
【发布时间】:2009-04-30 12:03:13
【问题描述】:

我正在编写一个大型 C# 应用程序。 关键是控件的颜色应该可以由应用程序的用户进行调整。 如果有任何解决方案可以覆盖(仅针对此应用程序的上下文)System.Drawing.SystemColors,那就太好了,这样我就不必手动设置每个控件的值。 有人知道我的问题的解决方案就这么简单吗? 谢谢

【问题讨论】:

  • 我认为这是 Winforms,而不是 WPF,因为您提到了 System.Drawing.SystemColors

标签: c# colors themes


【解决方案1】:

查看应用程序设置绑定。不确定如何对所有控件执行此操作,但只需通过控件树递归就足够了。

【讨论】:

    【解决方案2】:

    我认为您最好的方法是继承每个控件并设置其默认显示属性。这将为您提供一个标准 WinForms 控件库,您可以轻松地自定义和重复使用这些控件。更多信息here(在 VB 中,我在 C# 中找不到示例)。

    【讨论】:

      【解决方案3】:

      您不需要覆盖系统默认值,但您可以定义自己的颜色。

      Color NastyColour = Color.FromArgb(1, 2, 3);
      

      1 = 红色 2 = 绿色 3 = 蓝色

      【讨论】:

        【解决方案4】:

        很遗憾,不能仅为您的应用程序修改 Windows 配色方案。

        Winforms 可以更改窗体上所有控件的背景颜色等内容,但是对于许多区域(例如按钮上的斜角颜色或窗口标题栏),您可能需要诉诸于绘制控制自己。

        【讨论】:

          【解决方案5】:

          我写了下面的代码来做这样的事情。我对它不是特别满意,因为它需要对任何不寻常的控件进行专门处理,但它确实完成了工作。我保留了一个 Painter 实例,并在每次创建表单时调用 Apply,并将表单作为参数传递。它在所有子控件中递归,改变它们的外观

          public class Painter
          {
              Color foreColor;
              Color backColor;
              Color altBackColor;
              Color buttonColor;
              Font font;
          
              public Painter(Color foreColor, Color backColor, Color altBackColor, Color buttonColor, Font font)
              {
                  this.foreColor=foreColor;
                  this.backColor=backColor;
                  this.altBackColor=altBackColor;
                  this.buttonColor=buttonColor;
                  this.font=font;
              }    
          
              public void Apply(Control c)
              {
                  if(c==null)
                      return;
          
                  c.ForeColor = foreColor;
          
                  c.BackColor = (c is Button ) ? buttonColor
                                               : backColor;
          
                  if (c is DataGridView)
                  {
                      var dgv = (DataGridView) c;
                      dgv.BackgroundColor = BackColor;
                      dgv.AlternatingRowsDefaultCellStyle.BackColor = altBackColor;
                      dgv.ColumnHeadersDefaultCellStyle.BackColor = buttonColor;
                  }
          
                  c.Font = font;
          
                  foreach(Control child in c.Controls)
                      Apply(child);
              }
          }
          

          【讨论】:

            【解决方案6】:

            花费 1000 美元即可获得 DevExpress 的副本。我们正在使用他们的框架编写一个大型应用程序,并且皮肤功能非常好。

            我知道这听起来不是最好的答案,但如果您正在寻找应用程序范围的皮肤功能,第三方库可能是合适的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-18
              相关资源
              最近更新 更多