2010-10-07 22 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