WPF поддерживает возможность создания модальных диалоговых окон. При вызове модальное окно блокирует доступ к родительскому окну, пока пользователь не закроет модальное окно.
Для работы добавим в проект новое окно, которое назовем PasswordWindow. Это окно будет выполнять роль модального.
Изменим интерфейс PasswordWindow:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 |
<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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
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, чтобы из нее запускать диалоговое окно. Во-первых, определим кнопку:
|
1
2
3
4
5
6
7
8
9
10
11
12 |
<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>
|
И определим обработчик для этой кнопки:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
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("Авторизация не пройдена");
}
} |
В итоге при нажатии на кнопку будет отображаться следующее диалоговое окно:

И в зависимости от результатов ввода будет отображаться то или иное сообщение.