У меня есть куча элементов управления в моем окне. Одна из них - кнопка обновления, выполняющая громоздкую задачу в фоновом потоке.
Когда пользователь нажимает кнопку обновления, я помещаю курсор в состояние ожидания (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 с конвертером
Реализация параметризованного многопользовательского примера