在WPF窗口中禁用除一个子控件外的所有子控件

18

我在窗口上有一堆控件,其中一个是刷新按钮,它会在后台线程上执行繁琐的任务。

当用户点击刷新按钮时,我会将光标设置为等待状态(沙漏图标)并禁用整个窗口 -- Me.IsEnabled = False

我想通过让用户点击取消按钮来支持取消刷新操作,但是在整个窗口被禁用的情况下无法实现这一点。

除了逐个禁用每个控件(除了取消按钮)然后在用户点击取消时逐个重新启用它们之外,还有其他方法吗?


我似乎无法同时使用Me.IsEnabled和Me.Cursor。https://dev59.com/5EfRa4cB1Zd3GeqP7kE8 - Zack Peterson
3个回答

23

您可以将所有控件放在一个面板(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

我希望用户能够取消加载过程。我找到了一个很好的解决方案。

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

CancelButton.Enabled = true;

这也允许选择和移动主窗口,而不像this.Enabled = false;完全锁定了窗口。

在WP8中,控件没有IsEnabled属性。 - radders

3
您可以将每个控件的IsEnabled属性数据绑定到自定义布尔依赖属性上,该属性发出信号指示应用程序何时处于锁定状态。只是不要绑定取消按钮。
正如Donnelle所提到的,您可以使用转换器设置多重绑定。以下是您可以参考的几个示例。带有转换器的WPF多重绑定实现参数化多重绑定示例

我唯一的问题是,我的某些控件上的IsEnabled属性已经绑定到其他目的的布尔属性。 - Rob Sobers
1
你可以使用带有转换器的多绑定-- 有一些示例可以展示如何使用参数来实现AND或OR行为的通用多绑定。 - Donnelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接