2008-11-07 77 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; 其中窗完全鎖定了移動。