0

ツールボックス コントロールを WPF に実装したいと考えています。(写真でわかるように、mspaint ツールボックスのようなものです) ボタンの 1 つをクリックすると、他のボタンの状態の一部に影響を与えることができますが、残りのボタンには影響しません。さまざまな色で自分の主張を表現しようとしました。最初の赤いボタンをクリックしてから別の赤いボタンをクリックすると、両方ともクリックされたようになります。ただし、別のボタンをクリックすると、赤いボタンの状態が変わります。

私の質問はアーキテクチャに関するものです。ボタンのステータスを管理し、その中のさまざまなグループをサポートするためのよく知られた設計はありますか?

ここに画像の説明を入力

4

2 に答える 2

0

「オブザーバーパターン」の恩恵を受けると思います。http://en.wikipedia.org/wiki/Observer_pattern

サブジェクトはツールボックスになり、オブザーバーはツールボックス内のボタンになります。ボタンの状態を管理するのが非常に簡単になります。私は同様の目的で使用しました。

于 2013-11-14T13:26:35.843 に答える
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 に答える