【问题标题】:c# usercontrol setting list of options for custom propertyc# usercontrol设置自定义属性选项列表
【发布时间】:2014-03-21 23:32:14
【问题描述】:

我正在尝试创建一个自定义可折叠面板以用于我的一个项目。我已将它设置为显示哪些边应该能够折叠,并且它需要一个字符串输入{"None", "Up", "Right", "Down", "Left", "All"};

这是我目前所拥有的:

public partial class CollapsiblePanel : UserControl
{
    # region Collapse Direction
    List<string> DirectionOptions = new List<string> { "None", "Up", "Right", "Down", "Left", "All" };
    [Browsable(true), DefaultValue("All"), Description("Direction panel collapses. 0-none, 1-up, 2-right, 3-down, 4-left, 5-all")]
    [ListBindable(true), Editor(typeof(ComboBox), typeof(UITypeEditor))]
    private string _direction = "All";
    public List<string> Direction
    {
        get { return DirectionOptions; }
        set
        {
            DirectionOptions = value;
            callCollapseDirectionChanged();
        }
    }

    public event Action CollapseDirectionChanged;
    protected void callCollapseDirectionChanged()
    {
        Action handler = CollapseDirectionChanged;
        DisplayButtons();
        if (handler != null)
        {
            handler();
        }
    }
    # endregion

    public CollapsiblePanel()
    {
        InitializeComponent();
    }

    private void DisplayButtons()
    {
        switch (_direction)
        {
            case "None":
                buttonDown.Visible = false;
                buttonUp.Visible = false;
                buttonRight.Visible = false;
                buttonLeft.Visible = false;
                break;

            case "Up":
                buttonDown.Visible = false;
                buttonUp.Visible = true;
                buttonRight.Visible = false;
                buttonLeft.Visible = false;
                break;

            case "Right":
                buttonDown.Visible = false;
                buttonUp.Visible = false;
                buttonRight.Visible = true;
                buttonLeft.Visible = false;
                break;

            case "Down":
                buttonDown.Visible = true;
                buttonUp.Visible = false;
                buttonRight.Visible = false;
                buttonLeft.Visible = false;
                break;

            case "Left":
                buttonDown.Visible = false;
                buttonUp.Visible = false;
                buttonRight.Visible = false;
                buttonLeft.Visible = true;
                break;

            case "All":
                buttonDown.Visible = true;
                buttonUp.Visible = true;
                buttonRight.Visible = true;
                buttonLeft.Visible = true;
                break;
        }
    }
}

有人可以向我解释如何让设计师将DirectionOptions 列表作为可能的值提供给用户吗?他们可以选择任何一个字符串作为值。

【问题讨论】:

    标签: c# winforms user-controls custom-controls property-editor


    【解决方案1】:

    用户应该能够选择多个选项还是只选择一个?

    如果它只有一个 - 那么属性应该是枚举而不是列表。

    这样的事情应该可以工作:

    public partial class CollapsiblePanel : UserControl
    {
        public enum CollapseDirection
        {
            None,
            Up,
            Right,
            Down,
            Left,
            All
        }
    
        # region Collapse Direction
    
        [Browsable(true), DefaultValue("All"), Description("Direction panel collapses. 0-none, 1-up, 2-right, 3-down, 4-left, 5-all")]
        [ListBindable(true), Editor(typeof(ComboBox), typeof(UITypeEditor))]
        private CollapseDirection _direction = CollapseDirection.All;
        public CollapseDirection Direction
        {
            get { return _direction; }
            set
            {
                _direction = value;
                callCollapseDirectionChanged();
            }
        }
    
        public event Action CollapseDirectionChanged;
        protected void callCollapseDirectionChanged()
        {
            Action handler = CollapseDirectionChanged;
            DisplayButtons();
            if (handler != null)
            {
                handler();
            }
        }
        # endregion
    
        public CollapsiblePanel()
        {
            InitializeComponent();
        }
    
        private void DisplayButtons()
        {
            switch (_direction)
            {
                case CollapseDirection.None:
                    buttonDown.Visible = false;
                    buttonUp.Visible = false;
                    buttonRight.Visible = false;
                    buttonLeft.Visible = false;
                    break;
    
                case CollapseDirection.Up:
                    buttonDown.Visible = false;
                    buttonUp.Visible = true;
                    buttonRight.Visible = false;
                    buttonLeft.Visible = false;
                    break;
    
                case CollapseDirection.Right:
                    buttonDown.Visible = false;
                    buttonUp.Visible = false;
                    buttonRight.Visible = true;
                    buttonLeft.Visible = false;
                    break;
    
                case CollapseDirection.Down:
                    buttonDown.Visible = true;
                    buttonUp.Visible = false;
                    buttonRight.Visible = false;
                    buttonLeft.Visible = false;
                    break;
    
                case CollapseDirection.Left:
                    buttonDown.Visible = false;
                    buttonUp.Visible = false;
                    buttonRight.Visible = false;
                    buttonLeft.Visible = true;
                    break;
    
                case CollapseDirection.All:
                    buttonDown.Visible = true;
                    buttonUp.Visible = true;
                    buttonRight.Visible = true;
                    buttonLeft.Visible = true;
                    break;
            }
        }
    }
    
    • 注意 - 这是指南 - 我还没有测试过代码,但这应该能让您大致了解您想要实现的目标。

    【讨论】:

    • 非常感谢。就是这样。
    • 除了 void 方法之前的 public event Action CollapseDirectionChanged; 部分之外,我了解这里的所有内容。那实际上是做什么的?没有它你能让这段代码工作吗?
    猜你喜欢
    • 2010-10-25
    • 2020-09-09
    • 2012-03-16
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多