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

3
我曾经为了弄清楚为什么正常的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);

我看到光标发生了变化,但内容并没有被禁用。如果我添加:

disabled="true"

,它会防止用户编辑该输入字段。
CanvasRight.Opacity = enabling ? 1 : .5;

我认为它有时候有效,还有其他方法吗?
正在运行的任务是验证用户输入的数据,因此在GUI线程上运行要容易得多。这不应该很难。

2个回答

1

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

坦白地说,您应该只需实现 INotifyChanged 并将启用字段绑定到属性即可。这将确保控件正确地启用/禁用,因为绑定框架会进行正确的调度,我相信已经在 AffectsRender 中注册了 IsEnabled,这将使控件的视觉状态失效并强制重新绘制。

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

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

1
应该是<Trigger>而不是<DataTrigger>吧? - Amir Gonnen

0

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


为什么我不能像WinForms一样强制进行同步刷新? - rediVider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接