Свернуть дочернее окно в WPF, когда окно владельца дочернего окна владельца свернуто - PullRequest
1 голос
/ 16 января 2012

У меня есть окно в WPF, которое является владельцем окна, которое является владельцем всех других окон.

Основной владелец (sideWindow) - это всего лишь 200 точек по ширине.слева, а другое окно находится справа от главного окна.sideWindow имеет кнопку, которая открывает форму как дочернее окно правого окна.

Когда я сворачиваю mainWindow (sideWindow), только правое окно свернуто, а остальные дочерние окна не свернуты.

Как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2014

Самый простой способ сделать это, чтобы свойство Owner каждого дочернего окна указывало на главное окно. Вы делаете это?

2 голосов
/ 16 января 2012

Вы должны использовать решение для обмена сообщениями, чтобы достичь того, что вы хотите. GalaSofts MVVM light имеет встроенный мессенджер. Если вы свернете окно, я думаю, вы сделаете это с помощью команды, а затем во ViewModel вы можете отправить сообщение, а другие подписаться на это сообщение и свернуть Windows. Я думаю, что есть и другие решения Messenger, просто попробуйте Google.

GalaSoft MVVM Light

1 голос
/ 16 января 2012

Мне придется немного угадать здесь, так как я действительно не знаю архитектуру вашей программы. Я предполагаю, что у вас есть два класса Windows: MainWindow и SideWindow и один класс модели представления AppVm . Вам придется адаптироваться, если у вас другие настройки.

Самое простое решение - привязать WindowState обоих окон к одному свойству в ViewModel. Убедитесь, что собственность запускает уведомления.

Класс просмотра модели:

class AppVm : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    private WindowState m_state;
    public WindowState state {
        get { return m_state; }
        set { m_state=value; raise("state") }
    }
    private raise(string propname) {
        PropertyChanged(this, new PropertyChangedEventArgs(propname));
    }
    ....
}

Теперь в файлах Windows XAML свяжите WindowState с файлом модели представления:

<Window ... WindowState="{Binding Path=state,Mode=TwoWay} ...>

Обратите внимание, как я установил режим на TwoWay. Это гарантирует, что при изменении состояния при использовании щелчка по окну свертывания, оно также изменит значение в виртуальной машине. Вот и все.

Теперь, если ваша архитектура отличается, вам придется адаптироваться. Не ясно, что вы хотите сделать, когда пользователь развернет одно из окон (вы даже разрешаете это). Если у вас есть два разных класса модели представления для каждого окна, вы можете записать более сложный путь, предполагая, что одно представление имеет ссылку на другое представление, сохраняя переменную stae только во внутреннем классе, тогда оператор связывания может быть: Path = OtherVm.state. * * тысячу двадцать-один

Если ваша логика View более сложна, то можно иметь некоторый код в представлении (файлы * .xaml.cs). Единственное правило заключается в том, что модель представления не должна «знать» о представлении (теоретически, виртуальная машина также может запускать «представление модульного теста»). Вы можете подписаться на событие StateChanged of the View и записать свою логику там. В любом случае, самое чистое решение описано в приведенном выше примере кода.

Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...