2013-11-14 4 views
0

Я хочу реализовать элемент управления панели инструментов в WPF. (Как вы можете видеть на картинке свой вид панели инструментов mspaint) Нажатие одной из кнопок может влиять на состояние некоторых других кнопок, пока оно не влияет на остальных. Я попытался показать свою точку зрения разными цветами. Если вы нажмете на первую красную кнопку и еще одну красную кнопку, они оба будут заминаться при нажатии. , но если вы нажмете еще одну кнопку, это приведет к появлению красных кнопок.Дизайн панели инструментов .Net

Итак, мой вопрос об архитектуре, есть ли хорошо известный дизайн для управления статусами кнопок, улавливая разные группы в нем?

enter image description here

ответ

0

Я думаю, что вы выиграли бы от "наблюдателя Pattern". http://en.wikipedia.org/wiki/Observer_pattern

Объект будет панелью инструментов, а наблюдатели будут кнопками внутри панели инструментов. Это упрощает управление состояниями кнопок - я использовал их для аналогичных целей.

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)); 
    } 
} 

, а затем управления пользовательского интерфейса привязки данных:

var state = new ControlState(); 
controlRedOne.DataBindings.Add("Checked", state, "RedOneChecked"); 
Смежные вопросы