2008-11-07 75 views
13

我在窗口上有一堆控件。其中之一是刷新按钮,在后台线程上执行繁琐的任务。在WPF窗口中禁用除一个子控件之外的所有控件

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

我想通过让用户单击取消按钮来取消刷新操作,但是我无法在整个窗口被禁用时促进此操作。

除了禁用每个控件(除了取消按钮)之外,还有一种方法可以做到这一点,然后在用户单击取消时一个接一个地重新启用它们吗?

+0

我似乎无法使用Me.IsEnabled和Me.Cursor。 http://stackoverflow.com/questions/762396/wpf-wait-cursor-with-backgroundworker-thread – 2009-04-17 22:08:30

回答

19

你可以把一个面板(网格,StackPanel中,等)的所有控件,并在另一个小组留下了取消按钮。然后设置其他面板的IsEnabled属性。

实际上,这可能会引入多个附加面板。

举例来说,如果你有按钮的StackPanel中,你可以添加一个额外的StackPanel:

<StackPanel Orientation="Horizontal"> 
    <StackPanel x:Name="controlContainer" Orientation="Horizontal"> 
     <!-- Other Buttons Here --> 
    </StackPanel> 
    <Button Content="Cancel" /> 
</StackPanel> 

然后,你会做以下禁用一切,但取消按钮:

controlContainer.IsEnabled = false; 
+0

StackPanel在WP8中没有IsEnabled属性 – radders 2014-09-08 15:47:15

3

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

由于Donnelle提到你可以设置与转换器的多重绑定。这里有一些你可以参考的例子。 WPF MultiBinding with Converter Implementing Parameterized MultiBinding Sample

+0

我唯一的问题w /那就是我的一些控件上的IsEnabled属性已经绑定了数据绑定到一个布尔属性用于其他目的。 – 2008-11-07 22:34:19

+1

你可以使用一个多变量绑定与转换器 - 有关如何做一个具有与或行为的参数通用的例子。 – Donnelle 2008-11-08 23:17:15

5

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

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

CancelButton.Enabled = true; 

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