【问题标题】:Creating winforms base controls创建winforms基本控件
【发布时间】:2017-07-05 16:09:02
【问题描述】:

我们有几个 winforms 应用程序我们想要重新设计并使其保持一致(风格明智)。我们想为一些窗口控件(例如按钮和工具条)创建一些基类。我所有的基类打算做的是指定我们希望应用的特定样式。这在我第一次带入我的表单时有效,但后来如果我想更新一个属性,它不会将它应用回以前已经将其拉入的表单。无论如何要让它工作?这是一个示例,假设我想为工具条创建一个基类。我要做的就是将背景色设置为绿色(我真的很想设置更多属性,但这是为了演示我的问题)。所以我创建了一个名为 BaseControls 的类库,并创建了一个名为 BaseToolStrip 的类,并在其构造函数中将背景色设置为绿色。

public class BaseToolStrip : ToolStrip
{
  public BaseToolStrip()
  {
    BackColor = Color.Green; 
  }
}

现在,如果我创建一个演示项目并将 BaseToolStrip 的一个实例添加到它可以工作的表单中。它创建了一个绿色工具条。稍后,如果我决定我希望我的基本工具条具有红色的背景色,如果我更新我的 BaseToolStrip 类中的构造函数并设置 BackColor = Color.Red 并运行我的解决方案,颜色仍然是绿色。看来,一旦我将该控件放入其中,就会设置背景色 = 绿色。因此,即使在我的基类中,我在实例化它的表单中设置了 backcolor = red,它仍然具有 backcolor = green。有什么方法可以覆盖所有实例并将背景颜色设置为我的 BaseToolStrip 类中指定的颜色?

【问题讨论】:

  • 旁注不是基类,它是继承类,像MyStyledToolStrip 这样的东西会更好。
  • 这只是设计器的问题还是在运行时也会发生?
  • 也发生在运行时。

标签: c# winforms


【解决方案1】:

您的问题是 WinForms 设计器在使用该控件的任何设计器中将当前值保存在 InitializeComponent() 中。
这发生在您的 ctor 运行并替换您的值之后。

您可以通过覆盖/隐藏该属性并添加[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 来防止这种情况发生(您需要重新打开并重新保存所有使用它的设计器来删除该属性)。

【讨论】:

  • 这样做的副作用是不会保存对 BackColor 的任何更改。也许这对你来说是可取的,但如果你想这样做,我也会修复 setter,使其永远不会改变你的默认值 - 因为你无论如何都会覆盖它。
【解决方案2】:

尝试设置属性的默认值(以及设置ctor中的实际值):

[DefaultValue(typeof(Color), "Green")]
public override Color BackColor {
   get { return base.BackColor; }
   set { base.BackColor = value; }
}

我现在没有 VS 可供测试,但我认为这会导致设计者注意到当前值是默认值,因此不需要保存在 Designer.cs 中。

因此,如果您稍后更改这两个地方的颜色,它应该会在所有地方更新。

当然,这仅适用于添加此代码后拖到窗体上的控件,因为其他控件已经保存了值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多