WPF поддерживает возможность создания модальных диалоговых окон. При вызове модальное окно блокирует доступ к родительскому окну, пока пользователь не закроет модальное окно.
Для работы добавим в проект новое окно, которое назовем PasswordWindow. Это окно будет выполнять роль модального.
Изменим интерфейс PasswordWindow:
<Window x:Class="WindowApp.PasswordWindow" 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="Авторизация" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen"> <Grid Margin="10"> <Grid.RowDefinitions> <RowDefinition Height="20" /> <RowDefinition Height="20" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock>Введите пароль:</TextBlock> <TextBox Name="passwordBox" Grid.Row="1" MinWidth="250">Пароль</TextBox> <WrapPanel Grid.Row="2" HorizontalAlignment="Right" Margin="0,15,0,0"> <Button IsDefault="True" Click="Accept_Click" MinWidth="60" Margin="0,0,10,0">OK</Button> <Button IsCancel="True" MinWidth="60">Отмена</Button> </WrapPanel> </Grid> </Window>
Здесь определено текстовое поле для ввода пароля и две кнопки. Вторая кнопка с атрибутом IsCancel="True"
будет выполнять роль отмены.
А первая кнопка будет подтверждать ввод.
Для подтверждения ввода и успешного выхода из модального окна определим в файле кода PasswordWindow определим обработчик первой кнопки Accept_Click:
using System.Windows; namespace WindowApp { public partial class PasswordWindow : Window { public PasswordWindow() { InitializeComponent(); } private void Accept_Click(object sender, RoutedEventArgs e) { this.DialogResult = true; } public string Password { get { return passwordBox.Text; } } } }
Для успешного выхода из модального диалогового окна нам надо для свойства DialogResult установить значение true
. Для
второй кнопки необязательно определять обработчик, так как у нее установлен атрибут IsCancel="True"
, следовательно, ее нажатие будет эквивалентно
результату this.DialogResult = false;
. Этот же результат будет при закрытии диалогового окна на крестик.
Кроме того, здесь определяется свойство Password
, через которое мы можем извне получить введенный пароль.
И изменим главную форму 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="Login_Click" /> </Grid> </Window>
И определим обработчик для этой кнопки:
private void Login_Click(object sender, RoutedEventArgs e) { PasswordWindow passwordWindow = new PasswordWindow(); if(passwordWindow.ShowDialog()==true) { if(passwordWindow.Password=="12345678") MessageBox.Show("Авторизация пройдена"); else MessageBox.Show("Неверный пароль"); } else { MessageBox.Show("Авторизация не пройдена"); } }
В итоге при нажатии на кнопку будет отображаться следующее диалоговое окно:
И в зависимости от результатов ввода будет отображаться то или иное сообщение.