```
metanit.com
C# и WPF | Взаимодействие между окнами
4–5 минут
Взаимодействие между окнами

Последнее обновление: 21.03.2016

Рассмотрим, как мы можем взаимодействовать с несколькими окнами в WPF. Для этого создадим новый проект. По умолчанию он уже содержит одно главное окно MainWindow. Теперь добавим еще одно окно. Для этого в окне добавления нового элемента нам надо выбрать тип "Window (WPF)":

Добавление окна в WPF

Назовем его TaskWindow.

Теперь определим на главном окне MainWindow кнопку для открытия нового окна:

Обработчик нажатия кнопки Button_Click будет выглядеть так:

1

2

3

4

5
	

private void Button_Click(object sender, RoutedEventArgs e)

{

    TaskWindow taskWindow = new TaskWindow();

    taskWindow.Show();

}

Для открытия нового окна создаем его объект и затем вызываем метод Show().

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

При нажатии на кнопку открывается окно TaskWindow.

Используя ссылку на окно, мы можем взаимодействовать с ним, например, передавать ему данные из главной формы или вызывать его методы. Например, изменим код C# класса TaskWindow:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
	

using System.Windows;

namespace WindowApp

{

    public partial class TaskWindow : Window

    {

        public string ViewModel { get; set; }

        public TaskWindow()

        {

            InitializeComponent();

        }

        public void ShowViewModel()

        {

            MessageBox.Show(ViewModel);

        }

    }

}

Здесь добавлено свойство ViewModel и метод, который отображает его содержимое. Теперь изменим обработчик Button_Click в главном окне MainWindow:

1

2

3

4

5

6

7

8

9
	

private void Button_Click(object sender, RoutedEventArgs e)

{

    TaskWindow taskWindow = new TaskWindow();

    taskWindow.ViewModel = "ViewModel";

    taskWindow.Show();

    taskWindow.ShowViewModel();

}

Здесь у окна TaskWindow устанавливается свойство ViewModel и вызывается его метод.

Важно отметить, что после открытия эти окна существуют независимо друг от друга. Мы можем закрыть главное окно MainWindow, и второе окно TaskWindow все равно продолжит свою работу. Однако мы можем задать и другое поведение.

У всех окон есть свойство Owner, которое указывает на главное окно, владеющее текущим окном. Так, изменим обработчик Button_Click в главном окне:

1

2

3

4

5

6

7

8

9
	

private void Button_Click(object sender, RoutedEventArgs e)

{

    TaskWindow taskWindow = new TaskWindow();

    taskWindow.Owner = this;

    taskWindow.Show();

}

Теперь текущий объект MainWindow является владельцем taskWindow. Если, к примеру, мы закроем MainWindow, то закроется и TaskWindow.

Кроме того, мы можем обращаться из TaskWindow к своему владельцу:

1

2

3

4

5

6

7

8

9
	

public partial class TaskWindow : Window

{

    public void ChageOwnerBackground()

    {

        this.Owner.Background = new SolidColorBrush(Colors.Red);

    }

}

С другой стороны все зависимые окна доступны в главном окне-владельце через свойство OwnedWindows:

1

2

3

4

5

6

7

8

9

10

11

12

13

14
	

private void Button_Click(object sender, RoutedEventArgs e)

{

    TaskWindow taskWindow = new TaskWindow();

    taskWindow.Owner = this;

    taskWindow.Show();

    foreach(Window window in this.OwnedWindows)

    {

        window.Background = new SolidColorBrush(Colors.Red);

        if (window is TaskWindow)

            window.Title = "Новый заголовок!";

    }

}
Класс App и свойство Windows

Еще одним способ для взаимодействия с окнами предоставляет класс App - главный класс приложения. Он содержит свойство Windows, которое хранит информацию обо всех открытых окнах приложения. И в любом месте программы мы можем получить эту информацию:

1

2

3

4

5

6

7

8
	

foreach(Window window in App.Current.Windows)

{

    window.Background = new SolidColorBrush(Colors.Red);

    if (window is TaskWindow)

        window.Title = "Новый заголовок!";

}
```
итоговый результат в 4 файлах дай(taskwindow.xaml(.cs), mainwindow.xaml(.cs)