如何强制wpf窗口/控件刷新禁用的元素

时间:2010-10-07 23:47:19

标签: c# .net wpf user-interface refresh

我正在拔出我的头发试图弄清楚为什么正常的Dispatcher.Invoke命令不能用于重绘我的窗口,但现在我的问题似乎与被禁用的内容有关。我正在使用Dotnet 4.0完整框架。

如果我使用

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线程上运行。这不应该那么难。

2 个答案:

答案 0 :(得分:1)

并非所有控件都在视觉上表示被禁用,您可能会注意到它们无法从客户端使用。

坦率地说,您应该只实现INotifyChanged并将启用字段绑定到属性。这将确保控件正确启用/禁用,因为绑定框架将执行正确的调度IsEnabled我相信已在AffectsRender注册,这将使控件的视觉状态无效并强制重新绘制。< / p>

此外,您应该使用样式来调整控件的可视状态:

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

答案 1 :(得分:0)

如果您正在UI线程上运行长时间运行的验证操作,那么您将锁定UI,并且在验证完成之前无法更新Visual。到那时你已经重新启用了控件。如果操作足够长,用户会注意到它应该在后台线程上完成。