В случаях когда выполняется длительная операция, и пользователю необходимо запретить совершать какие либо действия в приложение.
Рисунок 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 идёт привязка к свойству видимости панели блокировки.
Автор: Сергей Степанов
Поделиться @