【问题标题】:How to repaint a WinFormsHost when it becomes visible?当 WinFormsHost 变得可见时如何重新绘制它?
【发布时间】:2010-09-28 20:51:04
【问题描述】:

我在 WPF 控件上的 WindowsFormsHost 中有一个 winforms 控件。 WPF 控件仅在某些时候可见,当它变得可见时,winforms 控件的内容通常会发生变化。

当 WPF 控件的 ViewModel 发生更改时,我会更改 winforms 控件的内容,并且 WPF 控件变得可见。

不幸的是,winforms 控件的先前内容被重新绘制,就像来自视觉缓存一样。我已经通过调试器运行了它,并且我知道 winforms 控件正在更新其数据,但在我重新调整程序窗口大小之前它不会重新绘制(当明显触发重新绘制时)。

我已经尝试过 Winforms 控件上的 Invalidate() 以及 WPF 控件的 DataContextChanged 事件处理程序内的 WPF 控件上的 InvalidateVisual()、InvalidateArrange() 和 InvalidateMeasure(),但似乎因为 WPF 控件不是此时可见(它即将变得可见)这些方法调用被吞没了。

关于如何在托管 WPF 控件变得可见后立即强制重绘 WinFormsHost ed winforms 控件,有人有什么聪明的想法吗?

【问题讨论】:

    标签: c# wpf winforms


    【解决方案1】:

    您是否尝试在 IsVisibleChanged 事件处理程序中使 WinForms 控件无效?

    【讨论】:

    • 不,但我现在有,但也没有用。我想这与调用 IsVisibleChanged 处理程序以响应可见性更改但在实际更改之前调用的问题相同。
    【解决方案2】:

    您应该能够在托管控件上调用Refresh(),只要您使其可见。 Refresh(),根据文档:

    强制控件使其客户区无效并立即重绘自身和所有子控件。

    【讨论】:

    • 遗憾的是,这也不起作用 - 因为在 DataContextChanged 处理程序中,winforms 控件、它的 WindowsFormsHost 和 WPF 控件都已折叠 - 所以重绘被吞没了。
    【解决方案3】:

    这原来是由于底层数据结构未能通知它已更改 - 根本与绘制方法无关! :( 谢谢你们的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-27
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多