Рассмотрим, как мы можем взаимодействовать с несколькими окнами в WPF. Для этого создадим новый проект. По умолчанию он уже содержит одно главное окно MainWindow. Теперь добавим еще одно окно. Для этого в окне добавления нового элемента нам надо выбрать тип "Window (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().
При нажатии на кнопку открывается окно 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, которое хранит информацию обо всех открытых окнах приложения. И в любом месте программы мы можем получить эту информацию:
foreach(Window window in App.Current.Windows) { window.Background = new SolidColorBrush(Colors.Red); // если окно - объект TaskWindow if (window is TaskWindow) window.Title = "Новый заголовок!"; }