【问题标题】:How do i force a wpf window/control refresh of disabled elements我如何强制禁用元素的 wpf 窗口/控件刷新
【发布时间】:2011-04-22 15:39:32
【问题描述】:

我正在拔头发试图弄清楚为什么正常的 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 线程上运行。这应该没那么难。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不应该是&lt;Trigger&gt;而不是&lt;DataTrigger&gt;吗?
    【解决方案2】:

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

    【讨论】:

    • 为什么我不能像winforms那样强制同步刷新?
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2010-10-29
    • 1970-01-01
    • 2011-06-22
    • 2011-08-06
    • 2015-01-08
    相关资源
    最近更新 更多