2

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

PickForEveryone PickForEveryoneWindow = new PickForEveryone(sSelRecipe, selMRM.sDay, selMRM.MealTypeID);
PickForEveryoneWindow.Owner = this;
PickForEveryoneWindow.ShowDialog();

其中 PickForEveryone 被定义为:

public partial class PickForEveryone : Window

<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">

并包含一个带有 DataGrid 和几个按钮和复选框的 Grid。

这在我的开发计算机上运行良好。但是,当对话框窗口关闭时,我的客户一直看到对话框窗口的一部分显示为父窗口顶部的视觉垃圾。也就是说,当 ShowDialog() 返回时,只有部分窗口未绘制。

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

我这里也看到了一个建议(针对另一种WPF显示问题)调用OnRender()来强制重绘,但是OnRender需要一个DrawingContext类型的参数,我不知道怎么弄。

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

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

4

5 回答 5

5

我在具有 ATOM N270 处理器的特定计算机上遇到了类似的问题。该问题似乎与图形硬件加速有关。

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

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration

我必须创建Avalon.Graphics文件夹。

DisableHWAcceleration是一个DWORD必须设置为1

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

希望这可以帮助。

参考 :

于 2012-10-05T09:46:48.157 回答
1

这个丑陋的代码对我有用:

        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;
        }
    }
于 2011-07-29T07:35:48.057 回答
0

这个解决方案有效,但不是很漂亮(很容易看到对话框被最小化然后设置为正常)。

this.WindowState = WindowState.Minimized;
this.WindowState = WindowState.Normal;
this.Topmost = true;
于 2011-02-09T08:10:48.217 回答
0

到目前为止,我尝试过的任何东西都无法在我客户的计算机上运行。我有一个新的修复(workaround hack)尝试进行客户端测试,其中涉及将窗口移开,并试图通过在我关闭对话框窗口之前启动一个空窗口来使其实际生效。叹...

于 2011-02-10T01:25:35.917 回答
0

所以我一直在 MS 论坛上寻找这个问题的答案,显然,这个问题的变体已经问了几年了。

他们说,有时,问题与视频驱动程序有关,尽管就我而言,我的客户最近更新了他的视频驱动程序。

我的印象是微软认为他们设计 WPF 是为了让开发人员永远不需要做强制重绘显示这样的事情,所以他们没有办法通过设计这样做。当然,无论出于何种原因出现问题,这意味着没有直接的方法可以做到这一点。看起来他们可能会这样做的方式(例如 InvalidateVisual() )却没有。

但我确实找到了一种可行的方法。嗯,两个。丑的是告诉窗口最小化并恢复正常。但这会导致它这样做的视觉动画,这并不理想。就我而言,它还让它隐藏在其他打开的窗口后面,需要我让它去最上面。但它确实以一种不和谐的方式解决了问题。

ShowDialog之后的代码:

    this.WindowState = WindowState.Minimized;
    this.WindowState = WindowState.Normal;
    this.Topmost = true;

更好的 hack,看起来有点像这样:

外部代码:

public delegate void NoArgDelegate();

ShowDialog之后的代码:

    this.Dispatcher.Invoke(
    System.Windows.Threading.DispatcherPriority.Loaded,
        (NoArgDelegate)delegate {}
    );

Presto ala kazzam!

于 2011-01-19T04:48:15.457 回答