修复WPF对话窗口留下的显示垃圾?

Dro*_*onz 2 wpf dialog redraw

在我的WPF应用程序中,我有WPF窗口可以打开其他WPF对话框窗口,我这样做如下:

PickForEveryone PickForEveryoneWindow = new PickForEveryone(sSelRecipe, selMRM.sDay, selMRM.MealTypeID);
PickForEveryoneWindow.Owner = this;
PickForEveryoneWindow.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

PickForEveryone定义为:

public partial class PickForEveryone : Window
Run Code Online (Sandbox Code Playgroud)

<Window x:Class="PFWb0.PickForEveryone"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
 ShowInTaskbar="False"
 Title="Pick Recipe For All" Height="536" Width="441" 
 WindowStartupLocation="CenterOwner">
Run Code Online (Sandbox Code Playgroud)

并包含一个带有DataGrid的网格和几个按钮和复选框.

哪个在我的开发计算机上运行良好.但是,当对话框窗口关闭时,我的客户端一直看到对话框窗口将其显示的一部分留在父窗口顶部的可视垃圾上.也就是说,当ShowDialog()返回时,只有部分窗口会展开.

我尝试添加this.InvalidateVisual(); 在上面的代码下面,但它没有解决问题.

我还看到了一个建议(对于另一种WPF显示问题)调用OnRender()强制重绘,但OnRender需要一个类型为DrawingContext的参数,我不知道如何获取.

所以,我问是否有人知道如何首先解决显示问题,或者如何通过让WPF重绘窗口来恢复它.

更新:正如下面对建议答案的评论中所见,我仍然没有适用于我客户端计算机的解决方案,而且我的解决方法(让窗户相互躲闪)已经不够了.唯一有效的方法是最小化和最大化污染的底层窗口.

sha*_*oet 5

我在使用ATOM N270处理器的特定计算机上遇到了类似的问题.这个问题与图形硬件加速相关联.

要停用加速,只需将其添加到注册表(这将停用所有WPF应用程序的硬件加速):

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration
Run Code Online (Sandbox Code Playgroud)

我不得不创建Avalon.Graphics文件夹.

DisableHWAcceleration是一个DWORD必须设置为1.

这解决了我的问题,如果我重新激活加速,问题又回来了.

希望这可以帮助.

参考文献: