2010-10-07 368 views
3

我拔出頭髮試圖弄清楚爲什麼正常的Dispatcher.Invoke命令不能重繪我的窗口,但現在我問題似乎是相關的到被禁用的內容。我正在使用Dotnet 4.0完整框架。我如何強制禁用元素的WPF窗口/控件刷新

如果我使用

private void DoSomething() 
{ 
    HandleBusyEnableDisable(false); 
    DoSomethingThatKeepsItBusy(); 
    HandleBusyEnableDisable(true); 
} 

private void HandleBusyEnableDisable(bool enabling) 
{ 
    Cursor = enabling ? Cursors.Arrow : Cursors.Wait; 
    CanvasFunctions.IsEnabled = enabling; 
    CanvasRight.IsEnabled = enabling; 
    CanvasRight.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, EmptyDelegate); 

我看到光標變化,但內容看起來並不禁止。如果我加

CanvasRight.Opacity = enabling ? 1 : .5; 

那麼我認爲它的工作,有時。有什麼我可以做的嗎?
正在運行的任務正在驗證用戶輸入的數據,因此它更容易在GUI線程上運行。這應該不那麼難。

回答

1

並非所有的控件在視覺上代表被禁用,您可能會注意到它們不會在客戶端使用。

坦率地說,您應該實施INotifyChanged並將啓用的字段綁定到屬性。這將確保控件正確啓用/禁用,因爲綁定框架將執行正確的調度,我認爲IsEnabled已註冊AffectsRender,這將使控件的視覺狀態無效並強制重新繪製。

而且你應該使用樣式來調節控制的可視狀態:

<Style TargetType="Grid"> 
    <Style.Triggers> 
    <DataTrigger Property="IsEnabled" Value="False"> 
     <Setter Property="Opacity" Value="0.5" /> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

不應該是''而不是''? – 2012-11-19 13:50:50

0

如果你正在運行在UI線程上長時間運行的驗證操作,你就鎖定了UI,它直到驗證完成後才能更新Visual。那個時候你已經重新啓用了控件。如果操作足夠長,以至於用戶會注意到它應該在後臺線程上完成。

+0

爲什麼我無法強制像winforms一樣進行同步刷新? – rediVider 2010-10-08 21:31:10