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

时间:2008-11-07 22:11:36

标签: wpf xaml controls code-behind

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

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

我想通过让用户点击取消按钮来支持取消刷新操作,但是在整个窗口被禁用时我无法做到这一点。

除了逐个禁用每个控件(取消按钮除外)之外,有没有其他方法可以执行此操作,然后在用户单击取消时逐个重新启用它们?

3 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:5)

我还希望用户能够取消加载。 我找到了一个可爱的解决方案。

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

CancelButton.Enabled = true;

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

答案 2 :(得分:3)

您可以将每个控件IsEnabled属性的数据绑定到您的自定义布尔依赖项属性,该属性会在您的应用程序处于锁定状态时发出信号。只是不要绑定取消按钮。

正如Donnelle所说,您可以使用转换器设置多重绑定。以下是您可以参考的几个示例。 WPF MultiBinding with Converter Implementing Parameterized MultiBinding Sample