Windows 10上的空白WPF子窗口

时间:2015-08-14 06:46:07

标签: wpf windows windows-10

我从Windows 8.1(64位)升级了Windows 10。在WPF应用程序(由我或其他人开发,如屏幕截图上的 todotxt.net )中,子窗口大部分时间都是空白的。

如果我将鼠标移到控件上,其中一些会出现(我猜是因为它们会处理 WM_MOUSEHOVER 消息以重新绘制自己)。有时候窗户还可以(约10-20%的发射时间)。我暂时通过隐藏和显示控件来解决问题(请在下面阅读)。

在Hyper-V上全新安装Windows 10不会重现错误。

有没有人遇到类似的问题?你是怎么解决的?

这里看起来如何(空白子窗口):

1 options-blank

鼠标移动后:

2 options-mousemove

我的解决方案

我无法在互联网上找到任何其他解决方案。如果您找到任何其他解决方案,请告诉我。

首先,简单的重新绘制(通过 InvalidateVisual())并没有解决问题。

我决定处理 ContentRendered 事件并隐藏然后显示所有控件。这个诀窍很有效,但它" 闻起来"。

在下面的代码中, mainGrid 是我子窗口最顶层网格的名称:

XAML:

<Window x:Class="MyApp.About"
    .........
    ContentRendered="Window_ContentRendered" 
    ...... >
    <Grid x:Name="mainGrid" ... >

CS:

private void Window_ContentRendered(object sender, EventArgs e)
{
    InvalidateVisual(); // Just in case
    var childCount = VisualTreeHelper.GetChildrenCount(mainGrid);

    for (int i = 0; i < childCount; ++i)
    {
        var child = VisualTreeHelper.GetChild(mainGrid, i) as UIElement;

        if (child != null)
        {
            child.Visibility = Visibility.Hidden;
            child.Visibility = Visibility.Visible;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

根据我的观察,这只是Windows 10上的Intel GPU驱动程序问题(Windows 8很好)。我们有一个WPF桌面应用程序,其中包含数千个在Windows 7,8,8中运行良好的用户,但是当安装在Windows 10中时,某些Windows 10运行良好,但有些将完全出现在该线程解释的内容中。

要解决此问题,最简单的方法是更新有问题的计算机的Intel GPU驱动程序。如果您拼命地发现即使您运行最新的Windows更新并且问题仍然存在也无济于事,请尝试通过以下方式手动更新驱动程序:

  1. 在&#34;设备管理器&#34;中,右键单击图形卡,然后选择&#34;更新驱动程序&#34;。
  2. 通过这种方式,Windows 10将尝试查找有时在Windows更新中不可用的最新驱动程序。
  3. 如果设备管理员告知您的驱动程序已经是最新的,那么最后的方法是在此处查找驱动程序:https://downloadcenter.intel.com/
  4. 对于某些机器,例如运行有点新的CPU / GPU(Atom X7)的Microsoft Surface 3(不是表面专业版),更新驱动程序似乎还不可能,我仍然在寻找这种机器的分辨率。

    在其他情况下,我的大部分英特尔高清GPU在更新到驱动程序版本10.18.15.4278后解决了这个问题

    注1:到目前为止,我还没有看到这个问题出现在其他GPU中,比如Nvidia或ATI。 注2:总的来说,我会说,除了最新的英特尔凌动X5 / X7之外,大多数其他英特尔高清显卡应该能够执行驱动程序更新并解决此问题。

答案 1 :(得分:3)

我现在更新了我的视频驱动程序,这似乎解决了这个问题。

Windows现在正确显示,无需下面列出的其他代码。 :)

自从从8.1升级到Windows 10后,我遇到了同样的问题。 我改变了窗口加载方法:

        WindowState = WindowState.Maximized;
        WindowState = WindowState.Normal;

这似乎是&#34;重绘&#34;窗口元素使它们显示出来。我已经多次测试过,每次窗口正确显示后立即从最大化恢复。我没有在xaml中设置窗口状态。

(另一个&#34;修复&#34;是将特定名称的宽度绑定设置为该类型的所有一个对象)。