Отключение всех дочерних элементов управления, кроме одного, в окне WPF - PullRequest
14 голосов
/ 08 ноября 2008

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

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

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

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

Ответы [ 3 ]

21 голосов
/ 08 ноября 2008

Вы можете разместить все элементы управления на одной панели (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;
5 голосов
/ 08 февраля 2011

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

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

CancelButton.Enabled = true;

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

3 голосов
/ 08 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...