0

我想在 WPF 中实现一个工具箱控件。(如图所示,它是一种 mspaint 工具箱)单击其中一个按钮可以影响其他按钮的某些状态,而不会影响其余按钮的状态。我试图用不同的颜色来表达我的观点。如果您单击第一个红色按钮,然后单击另一个红色按钮,则它们都将重复单击。但如果你点击另一个按钮,它会变成红色按钮状态。

所以我的问题是关于架构的,是否有一个众所周知的设计来管理按钮的状态,支持其中的不同组?

在此处输入图像描述

4

2 回答 2

0

你可以有一个代表状态的类(可以写得比这里好得多)。并使用 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");
于 2013-11-14T14:08:45.357 回答
0

我认为你会从“观察者模式”中受益。http://en.wikipedia.org/wiki/Observer_pattern

主题是工具箱,观察者是工具箱内的按钮。它使管理按钮的状态变得非常容易——我已经将它用于类似的目的。

于 2013-11-14T13:26:35.843 回答