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

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

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

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

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

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

<Window x:Class="WindowApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindowApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="250" Width="300">
    <Grid>
        <Button Width="100" Height="30" Content="Новое окно" Click="Button_Click" />
    </Grid>
</Window>

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

private void Button_Click(object sender, RoutedEventArgs e)
{
    TaskWindow taskWindow = new TaskWindow();
    taskWindow.Show();
}

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

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

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

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

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:

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 в главном окне:

private void Button_Click(object sender, RoutedEventArgs e)
{
    TaskWindow taskWindow = new TaskWindow();
    
	//Теперь MainWindow главное окно для taskWindow
	taskWindow.Owner = this;
	
	taskWindow.Show();
}

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

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

public partial class TaskWindow : Window
{
    public void ChageOwnerBackground()
    {
        this.Owner.Background = new SolidColorBrush(Colors.Red);
    }
	
	// остальной код
}

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

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, которое хранит информацию обо всех открытых окнах приложения. И в любом месте программы мы можем получить эту информацию:

foreach(Window window in App.Current.Windows)
{
    window.Background = new SolidColorBrush(Colors.Red);

	// если окно - объект TaskWindow
    if (window is TaskWindow)
        window.Title = "Новый заголовок!";
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850