【问题标题】:WPF ElementHost fails to paint with doublebuffering enabledWPF ElementHost 在启用双缓冲的情况下无法绘制
【发布时间】:2012-10-09 14:12:46
【问题描述】:

您好,我遇到了与 Question 类似的问题。

对我来说不同的是,我在 WinForms-MainForm 中使用“CreateParams-Method”来强制双缓冲。代码如下(例如DataGridView draws wrong):

protected override CreateParams CreateParams
{
    get
    {
        // Activate double buffering at the form level.  All child controls will be double buffered as well.
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;   // WS_EX_COMPOSITED
        return cp;
    }
} 

我现在的问题是,只要激活了这个 CreateParams,我的 WPF-ElementHost 在 WinForms-User 控件中的内容只有在有 mouseover 事件时才会被绘制。

简短描述:用户控件“打开”但它是透明的。在我用鼠标移动它之后,例如组合框被绘制。

只要我注释掉 CreateParams,一切都会正常工作(使用 WPF-ElementHost)。是否可以为 WPFElementHost 停用/使用不同的 CreateParams?

【问题讨论】:

  • 你解决过这个问题吗?我遇到了同样的问题。
  • @TormodFjeldskår:Nej。我从来没有找到解决这个问题的方法。我刚刚注释掉了整个应用程序的 CreateParams-Section。你有吗?
  • 不,很遗憾没有。从表单中删除了 CreateParams 代码,并将其添加到仅那些不承载 WPF 控件的屏幕中。

标签: wpf winforms double-buffering


【解决方案1】:

更改 WPF 控件上的 render mode 对我有用:

private void Control_Loaded(object sender, RoutedEventArgs e)
{
    HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
    HwndTarget hwndTarget = hwndSource.CompositionTarget;
    hwndTarget.RenderMode = RenderMode.SoftwareOnly;
}

【讨论】:

  • 我不能再复制这个了,已经有一段时间了.. ..很抱歉没有接受你的回答:/
  • 其实我后来发现这个答案有一个与显卡驱动有关的问题,会导致整个系统在某些计算机上崩溃stackoverflow.com/q/17473857/1102585,它适用于大多数机器但五分之一的机器我使用此解决方案测试崩溃
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2010-12-12
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多