Взаимодействие между окнами
98WPF --- Элементы управления WPF --- Взаимодействие между окнами
Как уже было показано, специальный класс приложения — отличное место для размещения кода, реагирующего на разные события приложения. Есть еще одно предназначение, которое замечательно подходит классу Application: хранение ссылок на важные окна, так чтобы одно окно могло обращаться к другому.
Данный прием имеет смысл применять при наличии немодального окна, которое существует в течение длительного времени и доступно нескольким разным классам (а не только классу, создавшему его). Если просто отображается модальное диалоговое окно как часть приложения, то этот прием будет чрезмерным. В данной ситуации окно не может существовать очень долго, и только код, создающий окно, нуждается в доступе к нему.
Например, предположим, что требуется отслеживать все окна документов, с которыми работает приложение. В этом случае можно создать выделенную коллекцию в специальном классе приложения. Рассмотрим пример, в котором для хранения группы специальных оконных объектов используется обобщенная коллекция List. В этом примере каждое окно документа представлено экземпляром класса по имени Document:
public partial class App : Application
{
private List<Document> docs = new List<Document>();
public List<Document> Documents
{
get { return docs; }
set { docs = value; }
}
}
Теперь, когда вы создаете новый документ, то должны просто не забыть добавить его к коллекции Documents.
private void newDoc_Click(object sender, RoutedEventArgs e)
{
Document doc = new Document();
doc.Owner = this;
doc.Show();
((App)Application.Current).Documents.Add(doc);
}
private void Update_Click(object sender, RoutedEventArgs e)
{
foreach (Document doc in ((App)Application.Current).Documents)
{
doc.SetContent("Обновление: " + DateTime.Now.ToLongDateString());
}
}
Теперь эту коллекцию можно использовать в любом месте кода, чтобы проходить в цикле по всем документам и обращаться к их общедоступным членам. В этом случае класс Document включает специальный метод SetContent() для обновления отображения.
Использовать свойство Documents удобно, т.к. оно строго типизировано и содержит только окна Document (а не коллекцию вообще всех окон приложения). Оно также дает возможность категоризации всех окон другим, более удобным способом, например, в коллекции Dictionary с ключевыми именами для облегчения поиска. В приложении на основе документов окна в коллекции можно индексировать по имени файла.
При взаимодействии между окнами не забывайте об объектно-ориентированных принципах — всегда используйте уровень специальных методов, свойств и событий, добавленных к классам окон. Никогда не открывайте прямой доступ к полям или элементам управления формы для других частей кода. Это может быстро привести к получению тесно связанного интерфейса, в котором одно окно глубоко вмешивается в работу другого, и расширять классы не удастся, не нарушая "нечеткой" взаимной зависимости между ними.