C# 如何创建具有类似于复选框的四种状态的wpf button类

C# 如何创建具有类似于复选框的四种状态的wpf button类,c#,wpf,C#,Wpf,使用WPF和.NET4.5 希望有人能帮我创建一个4状态按钮,功能类似于复选框。有效值应为:null、0、1或2 前三个状态将是与复选框相同的图形,第四个将增加边界厚度 为了做到这一点,我需要一些帮助来定义一个新的按钮类,该类在单击按钮时循环浏览这四种状态。给你 我已经创建了一个基于按钮的控件 XAML 我用触发器来控制视觉感知 代码隐藏 namespace CSharpWPF { /// <summary> /// Interaction logic for S

使用WPF和.NET4.5

希望有人能帮我创建一个4状态按钮,功能类似于复选框。有效值应为:null、0、1或2

前三个状态将是与复选框相同的图形,第四个将增加边界厚度

为了做到这一点,我需要一些帮助来定义一个新的按钮类,该类在单击按钮时循环浏览这四种状态。

给你

我已经创建了一个基于按钮的控件

XAML


我用触发器来控制视觉感知

代码隐藏

namespace CSharpWPF
{
    /// <summary>
    /// Interaction logic for StateButton.xaml
    /// </summary>
    public partial class StateButton : Button
    {
        public StateButton()
        {
            InitializeComponent();
            Click += (s, e) => ToggleState();
        }

        void ToggleState()
        {
            int? curState = State;
            if (curState == null)
                curState = 0;
            else
                curState++;

            if (curState > 2)
                curState = null;

            State = curState;
        }

        public int? State
        {
            get { return (int?)GetValue(StateProperty); }
            set { SetValue(StateProperty, value); }
        }

        // Using a DependencyProperty as the backing store for State.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty StateProperty =
            DependencyProperty.Register("State", typeof(int?), typeof(StateButton), new PropertyMetadata(null), OnValidateState);

        private static bool OnValidateState(object value)
        {
            if (value == null)
                return true;

            int parseResult = 0;
            if (int.TryParse(Convert.ToString(value), out parseResult))
            {
                if (parseResult >= 0 && parseResult < 3)
                    return true;
            }

            return false;
        }
    }
}
名称空间CSharpWPF
{
/// 
///StateButton.xaml的交互逻辑
/// 
公共部分类StateButton:按钮
{
公共状态按钮()
{
初始化组件();
单击+=(s,e)=>ToggleState();
}
void ToggleState()
{
int?curState=状态;
if(curState==null)
游标状态=0;
其他的
curState++;
如果(光标>2)
curState=null;
状态=光标状态;
}
公共国际国家
{
获取{return(int?)GetValue(StateProperty);}
set{SetValue(StateProperty,value);}
}
//使用DependencyProperty作为状态的后备存储。这将启用动画、样式、绑定等。。。
公共静态只读DependencyProperty StateProperty=
DependencyProperty.Register(“State”,typeof(int?),typeof(StateButton),newpropertyMetadata(null),onValidateEstate);
私有静态bool OnValidateState(对象值)
{
如果(值==null)
返回true;
int parseResult=0;
if(int.TryParse(Convert.ToString(value),out parseResult))
{
如果(parseResult>=0&&parseResult<3)
返回true;
}
返回false;
}
}
}

您可以自定义自己的状态,当前为null、0、1、2。我建议您改用枚举。

您自己尝试了什么?这不是你的编码服务。@pushpraj你提到你可能有一个解决方案,我能理解你从哪里来,帕特里克,看起来可能是这样的。我可以创建一个继承自。。。我用按钮还是按钮座?至于状态或某个值,在两个父类中的一个上是否已经有了某些内容。感谢您的时间,我在这一个上肯定有点迷路。无需担心,您永远都是受欢迎的。快乐编码:)
namespace CSharpWPF
{
    /// <summary>
    /// Interaction logic for StateButton.xaml
    /// </summary>
    public partial class StateButton : Button
    {
        public StateButton()
        {
            InitializeComponent();
            Click += (s, e) => ToggleState();
        }

        void ToggleState()
        {
            int? curState = State;
            if (curState == null)
                curState = 0;
            else
                curState++;

            if (curState > 2)
                curState = null;

            State = curState;
        }

        public int? State
        {
            get { return (int?)GetValue(StateProperty); }
            set { SetValue(StateProperty, value); }
        }

        // Using a DependencyProperty as the backing store for State.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty StateProperty =
            DependencyProperty.Register("State", typeof(int?), typeof(StateButton), new PropertyMetadata(null), OnValidateState);

        private static bool OnValidateState(object value)
        {
            if (value == null)
                return true;

            int parseResult = 0;
            if (int.TryParse(Convert.ToString(value), out parseResult))
            {
                if (parseResult >= 0 && parseResult < 3)
                    return true;
            }

            return false;
        }
    }
}