Отключение всего одного дочернего элемента управления в окне WPF

У меня есть куча элементов управления в моем окне. Одна из них - кнопка обновления, выполняющая громоздкую задачу в фоновом потоке.

Когда пользователь нажимает кнопку обновления, я помещаю курсор в состояние ожидания (hourglass) и отключает все окно - Me.IsEnabled = False.

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

Есть ли способ сделать это, кроме как отключить каждый элемент управления (за исключением кнопки отмены) один за другим, а затем повторно включить их один за другим, когда пользователь нажимает на отмену?

Ответ 1

Вы можете поместить все элементы управления в одну панель (Grid, StackPanel и т.д.) и оставить кнопку отмены на другой панели. Затем установите свойство IsEnabled другой панели.

На практике это, вероятно, приведет к более чем одной дополнительной панели.

Например, если у вас есть StackPanel кнопок, вы можете добавить дополнительный StackPanel:

<StackPanel Orientation="Horizontal">
    <StackPanel x:Name="controlContainer" Orientation="Horizontal">
        <!-- Other Buttons Here -->
    </StackPanel>
    <Button Content="Cancel" />
</StackPanel>

Затем вы должны сделать следующее, чтобы отключить все, кроме кнопки отмены:

controlContainer.IsEnabled = false;

Ответ 2

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

foreach (Control ctrl in this.Controls)
    ctrl.Enabled = false;

CancelButton.Enabled = true;

Это также позволяет выбирать и перемещать главное окно в отличие от this.Enabled = false; который полностью блокирует окно.

Ответ 3

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

Как упоминал Donnelle Вы можете настроить множественное связывание с конвертером. Вот несколько примеров, на которые вы можете обратиться. WPF MultiBinding с конвертером Реализация параметризованного многопользовательского примера