我的窗口上有一堆控件。其中之一是在后台线程上执行繁琐任务的刷新按钮。
当用户单击刷新按钮时,我将光标置于等待(沙漏)状态并禁用整个窗口 -- Me.IsEnabled = False
。
我想通过让用户单击取消按钮来支持取消刷新操作,但是当整个窗口被禁用时,我无法做到这一点。
除了一个一个地禁用每个控件(取消按钮除外)然后在用户单击取消时一个个地重新启用它们之外,还有其他方法吗?
我的窗口上有一堆控件。其中之一是在后台线程上执行繁琐任务的刷新按钮。
当用户单击刷新按钮时,我将光标置于等待(沙漏)状态并禁用整个窗口 -- Me.IsEnabled = False
。
我想通过让用户单击取消按钮来支持取消刷新操作,但是当整个窗口被禁用时,我无法做到这一点。
除了一个一个地禁用每个控件(取消按钮除外)然后在用户单击取消时一个个地重新启用它们之外,还有其他方法吗?
您可以将所有控件放在一个面板中(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;
我还希望用户能够取消加载。我找到了一个可爱的解决方案。
foreach (Control ctrl in this.Controls)
ctrl.Enabled = false;
CancelButton.Enabled = true;
这也允许选择和移动主窗口,this.Enabled = false;
这与完全锁定窗口不同。
您可以将每个控件的 IsEnabled 属性数据绑定到您的自定义布尔依赖项属性,该属性会在您的应用程序处于锁定状态时发出信号。只是不要绑定取消按钮。
正如 Donnelle 提到的,您可以使用转换器设置多重绑定。这里有几个例子你可以参考。 WPF MultiBinding 与转换器 实现参数化 MultiBinding 示例