2015-04-16 64 views
2

我想要一个控件,允许如果另一个属性的值设置为特定值时显示属性。下面是我想什么是大大简化例如:C#动态设计时属性

public class CustomButton : Control 
{ 
    private ButtonType _bType = ButtonType.OnOff; 
    private Int32 _minPress = 50; // 50 mS 

    public ButtonType Button_Type 
    { 
     get { return _bType; } 
     set { _bType = value; } 
    } 

    public Int32 Minimum_Press_Time // Only for momentary buttons 
    { 
     get { return _minPress; } 
     set { _minPress = value; } 
    } 

} 
public enum ButtonType 
{ 
    Momentary, 
    OnOff 
} 

在增加的CustomButton到Windows.Forms的形式,在Minimum_Press_Time只会在属性窗口中显示,如果Button_Type改为ButtonType.Momentary。

这样的事情可能吗?

+0

那么,在设计时,如何通过属性窗口将属性更改为'Momentary'?如果用户不小心改变了它并想要改回它呢?看起来像一个不好的用户体验,除非我错过了一些东西。你能给一个真实的场景吗? –

+0

我想要什么“如果用户将按钮放在表单上,​​然后将Button_Type设置为Momentary,那么属性Minimum_Press_Time将出现在属性窗口中并且可以进行设置,如果用户将Button_Type设置为OnOff,则不再显示属性Minimum_Press_Time ,尽管这个值仍然在类变量中。“我不认为这是可能的。对于我的“真实”课,我有大约15个变量,根据所选的“类型”,它们是否有效。看起来我的选择是只显示所有属性(无论是否有效)或使用多个派生类。 –

回答

1

是的,它可能会接近但它看起来有点奇怪。我之前已经在一些控件上做了这个。下面是你需要做一个完整的例子:

public partial class CustomButton : Control 
{ 
    private ButtonType _buttonType = ButtonType.OnOff; 
    private CustomButtonOptions _options = new OnOffButtonOptions(); 

    [RefreshProperties(System.ComponentModel.RefreshProperties.All)] 
    public ButtonType ButtonType 
    { 
     get { return _buttonType; } 
     set 
     { 
      switch (value) 
      { 
       case DynamicPropertiesTest.ButtonType.Momentary: 
        _options = new MomentaryButtonOptions(); 
        break; 
       default: 
        _options = new OnOffButtonOptions(); 
        break; 
      } 
      _buttonType = value; 
     } 
    } 

    [TypeConverter(typeof(ExpandableObjectConverter))] 
    public CustomButtonOptions ButtonOptions 
    { 
     get { return _options; } 
     set { _options = value; } 
    } 

    public CustomButton() 
    { 
     InitializeComponent(); 
    } 
} 

public enum ButtonType 
{ 
    Momentary, 
    OnOff 
} 

public abstract class CustomButtonOptions 
{ 

} 

public class MomentaryButtonOptions : CustomButtonOptions 
{ 
    public int Minimum_Press_Time { get; set; } 

    public override string ToString() 
    { 
     return Minimum_Press_Time.ToString(); 
    } 
} 

public class OnOffButtonOptions : CustomButtonOptions 
{ 
    public override string ToString() 
    { 
     return "No Options"; 
    } 
} 

所以基本上所发生的事情是,你使用的是ExpandableObjectConverter一个抽象类型转换为一组选项。然后,使用RefreshProperties属性来告知属性网格,在该属性更改后需要刷新属性。

这是我发现的尽可能接近你要求的最简单的方法。属性网格并不总是以正确的方式刷新,所以有时会在没有可展开属性的选项集旁边出现“+”号。使用属性中的“ToString”使属性网格上的显示看起来很智能。

+0

我试过这个,它不是“完全”我想要的,但它确实提供了我需要的东西,所以我将其标记为我接受的答案......谢谢 –

+0

没有深入尝试制作动态编译的类型,这是关于你可以期望的最好的。 WPF处理它比WinForms好很多。 –