【问题标题】:C# WinForms custom control default propertiesC# WinForms 自定义控件默认属性
【发布时间】:2012-10-03 03:48:17
【问题描述】:

如何设置自定义控件的默认属性,即当它们第一次被拖到设计器中的表单上时?

在此处或通过 Google 找不到答案;我得到的只是如何约束这些值。

以宽度和高度为例,如果我在构造函数中设置它们,它们会在每次打开设计器时应用于控件。如何将它们设置为用户更改属性后不再应用的默认值?

【问题讨论】:

  • 您能否举例说明如何将其应用于基类属性?
  • 道歉 - 这是[DefaultValue(someValue)]。这是 MSDN 的链接,例如:msdn.microsoft.com/en-us/library/…
  • 我认为 DefaultValue 属性是您所需要的。 Visual Studio IDE 会将属性中指定的默认值放入设计器文件中。如果用户将默认值更改为其他值,Visual Studio IDE 将使用新值更新设计器文件。这将防止在重新打开控件时重新加载以前的值,因为默认值已被覆盖。
  • 我找不到将其应用于基类属性(宽度和高度)的方法。
  • @TobyWilson 你有没有想过一种方法来完成这个?我也面临同样的问题

标签: c# .net winforms custom-controls controls


【解决方案1】:

对我无法覆盖的属性有用的是使用new 运算符。例如,MultiSelect 控件上的 MultiSelect 属性。我希望 MultiSelect 默认为 false,但我仍然希望能够更改它。

如果我只是在构造函数中将它设置为false,或者在InitializeComponent中,问题(我认为)是默认值仍然是true,所以如果我在中将值设置为true设计师,设计师注意到true 是默认值,因此根本不设置属性,而不是将其明确设置为它认为已经是默认值的属性。但是值最终变成了false,因为这是在构造函数中设置的。

为了解决这个问题,我使用了以下代码:

/// <summary>Custom ListView.</summary>
public sealed partial class DetailsListView : ListView
{
   ...

   [DefaultValue(false)]
   public new bool MultiSelect {
      get { return base.MultiSelect; }
      set { base.MultiSelect = value; }
   }

这允许控件仍然有一个正常工作的MultiSelect 属性,默认为false 而不是true,并且仍然可以在新控件上切换该属性。

编辑:我遇到了一个与使用抽象形式有关的问题。我一直在使用抽象表单类,并在需要使用设计器时切换到具体实现。我发现当我切换我继承的类时,我的自定义控件上的属性将重置为旧的默认值。我似乎通过在自定义控件的构造函数中将属性设置为默认值来纠正这种行为。

【讨论】:

    【解决方案2】:

    尝试使用DefaultValue 属性。

    private int height;
    
    [DefaultValue(50)]
    public int Height
    {
        get 
        {
           return height;
        }
        set 
        {
           height=value;
        }
     }
    

    【讨论】:

    • 这不起作用,因为 Height 的基类属性没有被它覆盖。
    【解决方案3】:

    下面将允许您在显示表单时添加值,之后您可以根据需要进行设置。

    private int widthLength = 5;  
    
    public int Width {      
    
         get { return widthLength ; } 
         set { widthLength = value;   
    } 
    

    【讨论】:

    • 使用这个,当控件被拖到设计器中的窗体上时,默认属性不会被应用。我还收到一个编译器警告,它隐藏了继承的成员;按照警告的指示添加“新”不会改变行为。
    【解决方案4】:

    在构造函数中,设置您希望在将其拖到画布上时出现的属性值。 或者,如果它们是基本控件的内置属性,则在设计器代码类中设置它们。

    【讨论】:

    • 在构造函数中设置属性会导致每次打开设计器时都会应用它们,实际上意味着它们无法设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多