В моем окне есть несколько элементов управления. Одна из них - кнопка обновления, которая выполняет громоздкую задачу в фоновом потоке.
Когда пользователь нажимает кнопку обновления, я помещаю курсор в состояние ожидания (песочные часы) и отключаю все окно - Me.IsEnabled = False.
Я хотел бы поддержать отмену действия обновления, разрешив пользователю щелкнуть кнопку отмены, но я не могу облегчить это, пока все окно отключено.
Есть ли способ сделать это, кроме отключения каждого элемента управления (кроме кнопки отмены) по одному, а затем повторного включения их одного за другим, когда пользователь нажимает кнопку отмены?





Вы можете привязать данные каждого свойства IsEnabled к вашему настраиваемому логическому свойству зависимости, которое сигнализирует, когда ваше приложение заблокировано. Только не привязывайте кнопку отмены.
Как упоминал Доннель, вы можете настроить множественную привязку с помощью конвертера. Вот пара примеров, на которые вы можете сослаться. WPF MultiBinding с конвертеромРеализация параметризованного образца MultiBinding
Единственная проблема, с которой я столкнулся, заключается в том, что свойство IsEnabled в некоторых моих элементах управления уже является данными, привязанными к логическому свойству для других целей.
Вы можете использовать мульти-привязку с конвертером - есть примеры того, как сделать универсальную привязку с параметром для поведения И или ИЛИ.
Вы можете поместить все элементы управления на одну панель (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;
StackPanel не имеет свойства IsEnabled в WP8
Что ж, я проделал 0 работ с WP8, но я нашел документацию для WP8 StackPanel: msdn.microsoft.com/en-US/library/windows/apps/… Я предполагаю, что вы используете этот api, а не Silverlight, поскольку Silverlight имеет свойство IsEnabled. Хотя вы не получите точного вида отключенных элементов управления, вы всегда можете настроить IsHitTestVisible = "false" на отключение ввода на controlContainer. В противном случае у вас может быть полупрозрачный оверлей, который вы делаете видимым, когда хотите отключить другие элементы управления (и использовать Grid в качестве внешней панели).
Я также хотел, чтобы пользователь мог отменить загрузку. Я нашел прекрасное решение.
foreach (Control ctrl in this.Controls)
ctrl.Enabled = false;
CancelButton.Enabled = true;
Это также позволяет выбирать и перемещать главное окно, в отличие от this.Enabled = false;.
который полностью закрывает окно.
Control не имеет свойства IsEnabled в WP8
Кажется, я не могу использовать одновременно Me.IsEnabled и Me.Cursor. stackoverflow.com/questions/762396/…