修复WPF对话框窗口留下的显示垃圾?
在我的WPF应用程序中,我有可以打开其他WPF对话框窗口的WPF窗口,我的操作如下:修复WPF对话框窗口留下的显示垃圾?,wpf,dialog,redraw,Wpf,Dialog,Redraw,在我的WPF应用程序中,我有可以打开其他WPF对话框窗口的WPF窗口,我的操作如下: PickForEveryone PickForEveryoneWindow = new PickForEveryone(sSelRecipe, selMRM.sDay, selMRM.MealTypeID); PickForEveryoneWindow.Owner = this; PickForEveryoneWindow.ShowDialog(); 其中,PickForEveryone的定义为: publi
PickForEveryone PickForEveryoneWindow = new PickForEveryone(sSelRecipe, selMRM.sDay, selMRM.MealTypeID);
PickForEveryoneWindow.Owner = this;
PickForEveryoneWindow.ShowDialog();
其中,PickForEveryone的定义为:
public partial class PickForEveryone : Window
及
并包含一个带有DataGrid和几个按钮和复选框的网格
这在我的开发计算机上运行良好。但是,当对话框窗口关闭时,我的客户端一直看到对话框窗口将其显示的一部分作为视觉垃圾留在父窗口的顶部。也就是说,当ShowDialog()返回时,只有部分窗口取消绘制
我试着添加这个。InvalidateVisual();下面是上面的代码,但它没有解决问题
我在这里还看到一个建议(针对另一种WPF显示问题)调用OnRender()强制重画,但OnRender需要DrawingContext类型的参数,我不知道如何获取该参数
因此,我想问的是,是否有人知道如何首先修复显示问题,或者如何通过让WPF重新绘制窗口来从中恢复
更新:如下面对建议答案的评论所示,我仍然没有在我客户的计算机上运行的解决方案,并且我的解决方法(让windows互相回避)已经不够了。唯一有效的方法是最小化和最大化被污染的底层窗口。所以我一直在MS论坛上寻找答案,显然,这一问题的变体已经被问了好几年了 他们说,有时问题与视频驱动程序有关,尽管在我的案例中,我的客户最近更新了他的视频驱动程序 我的印象是,微软认为他们设计WPF是为了让开发人员永远不需要做强迫重新绘制显示的事情,所以他们没有办法通过设计来做到这一点。当然,当事情出于任何原因出错时,这意味着没有直接的方法可以做到这一点。而那些看起来可能会这样做的方式(比如InvalidateVisual())却不会 但我确实找到了一个有用的黑客。嗯,两个。丑陋的一个是告诉窗口最小化并恢复正常。但这样做会产生一个视觉动画,这并不理想。在我的情况下,它也使它隐藏在其他打开的窗口后面,需要我使它走到最上面。但它确实以一种令人不安的方式解决了问题 ShowDialog之后的代码:
this.WindowState = WindowState.Minimized;
this.WindowState = WindowState.Normal;
this.Topmost = true;
this.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Loaded,
(NoArgDelegate)delegate {}
);
更好的黑客,看起来有点像这样:
外部代码:
public delegate void NoArgDelegate();
ShowDialog之后的代码:
this.WindowState = WindowState.Minimized;
this.WindowState = WindowState.Normal;
this.Topmost = true;
this.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Loaded,
(NoArgDelegate)delegate {}
);
普雷斯托·阿拉·卡扎姆 这个解决方案是可行的,但它不是很漂亮(很容易看到对话框被最小化,然后设置为正常)
到目前为止,我试过的东西在我客户的电脑上都不起作用。
我在客户端测试中尝试了一个新的补丁(变通黑客),它涉及到将窗口移开,并试图在关闭对话框窗口之前启动一个空窗口,使其真正生效。唉…这个难看的代码对我来说很有用:
void RefreshWindow()
{
switch (WindowState)
{
case WindowState.Maximized:
{
double oldWidth = Width;
Width = System.Windows.SystemParameters.PrimaryScreenWidth - 1;
WindowState = System.Windows.WindowState.Normal;
WindowState = System.Windows.WindowState.Maximized;
Width = oldWidth;
}
break;
case WindowState.Normal:
if (Width > 1)
{
Width -= 1;
Width += 1;
}
else
{
Width += 1;
Width -= 1;
}
break;
case WindowState.Minimized:
default:
// no action necessary
break;
}
}
我在一台装有ATOM N270处理器的特定计算机上遇到了类似的问题。 这个问题与图形硬件加速有关 要停用加速,只需将其添加到注册表(这将停用所有WPF应用程序的硬件加速): 我必须创建
Avalon.Graphics
文件夹
disablehAcceleration
是必须设置为1
的DWORD
这已经解决了我的问题,如果我重新启动加速,问题就会回来
希望这有帮助
参考资料:
- WPF应用程序中图形问题的故障排除指南:
- 图形渲染注册表设置:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration