Взаимодействие между окнами

98

Как уже было показано, специальный класс приложения — отличное место для размещения кода, реагирующего на разные события приложения. Есть еще одно предназначение, которое замечательно подходит классу 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 с ключевыми именами для облегчения поиска. В приложении на основе документов окна в коллекции можно индексировать по имени файла.

При взаимодействии между окнами не забывайте об объектно-ориентированных принципах — всегда используйте уровень специальных методов, свойств и событий, добавленных к классам окон. Никогда не открывайте прямой доступ к полям или элементам управления формы для других частей кода. Это может быстро привести к получению тесно связанного интерфейса, в котором одно окно глубоко вмешивается в работу другого, и расширять классы не удастся, не нарушая "нечеткой" взаимной зависимости между ними.

Пройди тесты
Лучший чат для C# программистов