В случаях когда выполняется длительная операция, и пользователю необходимо запретить совершать какие либо действия в приложение.

Рисунок 1: Окно с разблокированными элементами

Рисунок 2: Окно с заблокированными элементами
WPF:
<Window ...> <Grid> <!-- Элементы страницы --> <Grid x:Name="WaitPanel" Background="#4CB8B8B8" Grid.ColumnSpan="20" Grid.RowSpan="20"> <TextBlock Text="Подключение к серверу..." Foreground="#FF7E7E7E" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24" FontWeight="Bold"/> lt;/Grid> </Grid> </Window>
Пример использования (C#):
private async void SaveDBClick(object sender, RoutedEventArgs e)
{
WaitPanel.Visibility = System.Windows.Visibility.Visible;
await App.Service.Save();
WaitPanel.Visibility = System.Windows.Visibility.Hidden;
}
Данный способ работает если в качестве контейнера у окна используется Grid.
Метод заключается в том что бы создать элемент который заполнит весь Grid контейнера и будет перекрывать все элементы управления.
В конец кода XAML добавляется панель которая и будет перекрывать все элементы.
Укажите в Grid.ColumnSpan и Grid.RowSpan число большее (на будущее) чем у Вас столбцов и строк у основного контейнера, это позволит перекрывать Вам все элементы. Можете указать заведомо большее число что бы в будущем при добавление новых элементов не оставить их без блокировки.
Замечания:
Более «красивый» вариант использования если панель блокировки будет открываться автоматически когда Ваше приложение занято длительной операцией. Например если у Вас объект для взаимодействием с сервером, то в нём можно предусмотреть поле которое будет показывать активно ли подключение — нужно ли блокировать интерфейс.
<Window ...>
<Grid>
<!-- Элементы страницы -->
<Grid x:Name="WaitPanel" Background="#4CB8B8B8" Grid.ColumnSpan="20" Grid.RowSpan="20">
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding Lag, FallbackValue=False, TargetNullValue=False}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding Lag, FallbackValue=False, TargetNullValue=False}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<TextBlock Text="Подключение к серверу..." Foreground="#FF7E7E7E" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24" FontWeight="Bold"/>
</Grid>
</Grid>
</Window>
Таким образом с помощью DataTriggers идёт привязка к свойству видимости панели блокировки.
Автор: Сергей Степанов
Поделиться @