Блокировка элементов окна

Для чего может понадобиться

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

Окно с разблокированными элементами
Рисунок 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 число большее (на будущее) чем у Вас столбцов и строк у основного контейнера, это позволит перекрывать Вам все элементы. Можете указать заведомо большее число что бы в будущем при добавление новых элементов не оставить их без блокировки.

Замечания:

  • У панели обязательно должен быть задан фон (Background), иначе элементы будут доступны. Фон можно задать как Background="#00000000" — его не будет видно, но это всё равно будет работать.

Привязка блокировки к данным

Более «красивый» вариант использования если панель блокировки будет открываться автоматически когда Ваше приложение занято длительной операцией. Например если у Вас объект для взаимодействием с сервером, то в нём можно предусмотреть поле которое будет показывать активно ли подключение — нужно ли блокировать интерфейс.

<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 идёт привязка к свойству видимости панели блокировки.

Автор: Сергей Степанов

Поделиться @
aaa, 28 июня 2022 в 21:11