在 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 窗口中禁用除一个子控件之外的所有子控件的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用表单上除按钮之外的所有控件?

在 wpf C# 中禁用自定义父项时启用子控件

WPF:如何使用透明画布和可点击子项制作覆盖控件

WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

除了按钮之外,如何禁用表单上的所有控件?

如何在 webbrowser WPF 顶部打开用户控件作为弹出窗口