我想在 WPF 中实现一个工具箱控件。(如图所示,它是一种 mspaint 工具箱)单击其中一个按钮可以影响其他按钮的某些状态,而不会影响其余按钮的状态。我试图用不同的颜色来表达我的观点。如果您单击第一个红色按钮,然后单击另一个红色按钮,则它们都将重复单击。但如果你点击另一个按钮,它会变成红色按钮状态。
所以我的问题是关于架构的,是否有一个众所周知的设计来管理按钮的状态,支持其中的不同组?
我想在 WPF 中实现一个工具箱控件。(如图所示,它是一种 mspaint 工具箱)单击其中一个按钮可以影响其他按钮的某些状态,而不会影响其余按钮的状态。我试图用不同的颜色来表达我的观点。如果您单击第一个红色按钮,然后单击另一个红色按钮,则它们都将重复单击。但如果你点击另一个按钮,它会变成红色按钮状态。
所以我的问题是关于架构的,是否有一个众所周知的设计来管理按钮的状态,支持其中的不同组?
你可以有一个代表状态的类(可以写得比这里好得多)。并使用 INotifyPropertyChanged 和 Binding 来控制按钮的状态。我并不完全相信这是一种“很棒”的方式。但这是一种方式(我认为它可能与另一个答案中提到的观察者模式有一些联系)。
首先是代表状态的类:
public class ControlState : INotifyPropertyChanged
{
private bool _redOneChecked;
public bool RedOneChecked {
get { return _redOneChecked; }
set
{
OnPropertyChanged("RedOneChecked");
_redOneChecked = value;
RedTwoChecked = RedOneChecked;
GreenOneChecked = !RedTwoChecked;
}
}
private bool _redTwoChecked;
public bool RedTwoChecked
{
get { return _redTwoChecked; }
set
{
OnPropertyChanged("RedTwoChecked");
_redTwoChecked = value;
RedOneChecked = RedTwoChecked;
GreenOneChecked = !RedTwoChecked;
}
}
private bool _greenOneChecked;
public bool GreenOneChecked
{
get { return _greenOneChecked; }
set
{
OnPropertyChanged("GreenOneChecked");
_greenOneChecked = value;
RedOneChecked = !GreenOneChecked;
RedTwoChecked = !GreenOneChecked;
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
然后对 UI 控件进行数据绑定:
var state = new ControlState();
controlRedOne.DataBindings.Add("Checked", state, "RedOneChecked");
我认为你会从“观察者模式”中受益。http://en.wikipedia.org/wiki/Observer_pattern
主题是工具箱,观察者是工具箱内的按钮。它使管理按钮的状态变得非常容易——我已经将它用于类似的目的。