在 WPF 窗口中禁用除一个子控件之外的所有子控件
Posted
技术标签:
【中文标题】在 WPF 窗口中禁用除一个子控件之外的所有子控件【英文标题】:Disabling all but one child control in a WPF window 【发布时间】:2010-09-21 09:20:34 【问题描述】:我的窗口上有一堆控件。其中之一是在后台线程上执行繁琐任务的刷新按钮。
当用户单击刷新按钮时,我将光标置于等待(沙漏)状态并禁用整个窗口 -- Me.IsEnabled = False
。
我想通过让用户单击取消按钮来支持取消刷新操作,但是当整个窗口被禁用时我无法实现这一点。
除了逐个禁用每个控件(取消按钮除外)然后在用户单击取消时逐个重新启用它们之外,还有其他方法吗?
【问题讨论】:
我似乎无法同时使用 Me.IsEnabled 和 Me.Cursor。 ***.com/questions/762396/… 【参考方案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;
【讨论】:
StackPanel 在 WP8 中没有 IsEnabled 属性 好吧,我已经用 WP8 完成了 0 次工作,但我找到了 WP8 的文档StackPanel
: msdn.microsoft.com/en-US/library/windows/apps/… 我假设你使用的是那个 api,而不是 Silverlight 的,因为 Silverlight有一个IsEnabled
属性。虽然您无法获得禁用控件的确切外观,但您始终可以将IsHitTestVisible="false"
设置为禁用controlContainer
上的输入。否则,当您想要禁用其他控件(并使用Grid
作为外部面板)时,您可能会有一个半透明的覆盖层。【参考方案2】:
我还希望用户能够取消加载。 我找到了一个不错的解决方案。
foreach (Control ctrl in this.Controls)
ctrl.Enabled = false;
CancelButton.Enabled = true;
这也允许选择和移动主窗口,不像this.Enabled = false;
这完全锁定了窗口。
【讨论】:
控件在 WP8 中没有 IsEnabled 属性【参考方案3】:您可以将每个控件的 IsEnabled 属性数据绑定到您的自定义布尔依赖项属性,该属性会在您的应用程序处于锁定状态时发出信号。只是不要绑定取消按钮。
正如 Donnelle 所说,您可以使用转换器设置多重绑定。这里有几个例子你可以参考。 WPF MultiBinding with Converter Implementing Parameterized MultiBinding Sample
【讨论】:
我遇到的唯一问题是,我的某些控件上的 IsEnabled 属性已经是为其他目的而绑定到布尔属性的数据。 您可以将多重绑定与转换器一起使用——有一些示例说明如何使用 AND 或 OR 行为的参数进行通用绑定。以上是关于在 WPF 窗口中禁用除一个子控件之外的所有子控件的主要内容,如果未能解决你的问题,请参考以下文章