修复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

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

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应用程序中图形问题的故障排除指南:
  • 图形渲染注册表设置:

哎呀,显然这并不能完全解决问题。如果有人知道这个问题的原因,请告诉我。我尝试了UpdateLayout(),但没有效果。我现在还尝试在关闭对话框窗口之前将其最小化。这也不起作用。然后我添加了代码,将对话框窗口移动到屏幕外坐标,然后最小化它,然后关闭它,这也不起作用。它确实改变了我的开发计算机上的“离开”动画,因此它会闪烁而不是收缩然后离开,但它仍然会在父窗口上留下垃圾。但是,我的客户报告说,如果他手动移动对话框窗口,它会确定垃圾会留在哪里,因此我认为移动窗口会起作用,如果我能在它关闭之前让它真的这么做。我想,通过调用更改X和Y,最小化然后关闭,位置和最小化调用在关闭生效之前不会生效。在关闭对话框窗口之前,有人会建议我如何延迟或强制对其进行视觉更新?特定计算机上的图形“错误”很可能是该计算机上的错误显示驱动程序造成的。如果问题在DirectX中,那么WPF可以触发问题,而Windows窗体应用程序则不会。是的。几年前,我在MSDN论坛上发现了相关投诉,但没有人对此进行修复。另外,我的客户正在为他的视频适配器运行最新的驱动程序(当然,这并不意味着它没有bug,但这意味着更新驱动程序并没有简单的修复方法)。此外,他还尝试插入不同的视频卡,但在他的机器上仍然显示出这个问题。我想现在可能是Vista,或者更准确地说,你所说的-一些特定的驱动程序。实际上,我尝试过的解决方案没有一个能在客户端的计算机上工作。谢谢。我在上面给自己的第一个“答案”中发布了这个。这个程序应该可以运行(以它运行时的笨拙方式),但实际上我还没有让我的客户运行它。如果我昨天提到的计划不起作用,我会让他试一试。那次尝试也失败了。最后,我只是避免了堆叠这些窗口,尽管其他窗口似乎能够堆叠而不留下垃圾,这一点我很满意
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration