2

我在我的 WPF 应用程序中发现了一个奇怪的错误,我正在尝试确定它是 WPF 还是我的图形驱动程序的问题,以便我可以将其报告给相应的公司。我有一个 Quadro FX 1700,在 Windows XP 系统上运行最新的驱动程序 (197.54),运行 .NET 3.5 SP1 应用程序。

我有双显示器,左侧是主显示器,右侧是辅助显示器。当我最大化然后在我的主监视器上恢复主窗口的子窗口时,就会出现问题。子窗口在主监视器上的大小正确,但它在我的辅助监视器上绘制,就好像它仍然处于最大化状态一样。在主监视器上移动子窗口将其移动到辅助监视器上。

恢复的子窗口在辅助监视器上绘制,就好像它仍然处于最大化状态

我制作了一个导致这种行为的示例应用程序(代码如下)。

  1. 启动应用程序并确保主窗口位于您的主监视器上。
  2. 双击主窗口。应该会出现一个绿色的子窗口。
  3. 单击绿色子窗口最大化。
  4. 单击绿色子窗口进行恢复。

其他人可以重现这个问题吗?在我的系统上,绿色孩子恢复了,但随后它被绘制在我的主显示器和辅助显示器上,而不仅仅是主显示器。

应用程序.xaml

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="DualMonitorBug.App"
    StartupUri="Shell.xaml" />

应用程序.xaml.cs

using System.Windows;
namespace DualMonitorBug { public partial class App : Application { } }

壳牌.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="DualMonitorBug.Shell"
    Title="Shell" Height="480" Width="640"
    MouseDoubleClick="ShowDialog" />

Shell.xaml.cs

using System.Windows;
using System.Windows.Input;

namespace DualMonitorBug
{
    public partial class Shell : Window
    {
        public Shell()
        {
            InitializeComponent();
        }

        private void ShowDialog(object sender, MouseButtonEventArgs e)
        {
            DialogWindow dialog = new DialogWindow();
            dialog.Owner = this;
            dialog.Show();
        }
    }
}

对话框窗口.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="DualMonitorBug.DialogWindow"
    Title="Dialog Window" Height="240" Width="320"
    AllowsTransparency="True"
    Background="Green"
    MouseLeftButtonDown="ShowHideDialog"
    WindowStyle="None" />

DialogWindow.xaml.cs

using System.Windows;
using System.Windows.Input;

namespace DualMonitorBug
{
    public partial class DialogWindow : Window
    {
        public DialogWindow() { InitializeComponent(); }

        private void ShowHideDialog(object sender, MouseButtonEventArgs e)
        {
           if (e.ClickCount == 1)
           {
               if (this.WindowState == WindowState.Normal)
               {
                   this.DragMove();
               }
           }
           else
           {
               this.WindowState
                   = (this.WindowState == WindowState.Normal)
                   ? WindowState.Maximized
                   : WindowState.Normal;
           }
        }
    }
}
4

3 回答 3

1

您的应用程序在我的系统上运行良好。我正在运行双显示器,3.5SP1,但我有一个 Radeon HD4670。

于 2010-04-21T15:09:02.947 回答
0

我也有同样的问题。我不认为这是显卡问题,因为我在台式机上尝试过,然后在带扩展显示器的笔记本电脑上尝试过,并且在标准化真实窗口后,总是在第二台显示器上看到额外的最大化窗口。如果此处涉及图形,我会说它涉及 WPF 并非旨在与所有图形卡兼容的方式。

这只发生在我使用自定义的最大化/最小化按钮并根据按钮单击事件设置 WindowState 时。如果我使用 Windows 默认按钮最大化窗口,一切正常。我对找到解决此问题的方法感到沮丧,因此我编写了一些代码来通过更改窗口大小来最大化/标准化。

于 2010-06-17T18:50:31.253 回答
0

好的,我今天尝试了一些东西,似乎问题发生了,因为最大化活动在将窗口移动到左上角之前将宽度扩展到第二个监视器。因此,当您对窗口进行规范化时,扩展部分仍然在第二个监视器中,直到您将窗口拖到第二个监视器时才会被清除。

要解决此问题,在将 WindowState 设置为 Maximized 之前,首先将 Width 和 Height 设置为零。这将解决问题。您可能希望缓存当前的 Top 和 Left 以便当窗口标准化时,它会返回到先前的位置:

最大化代码:

 _oldTop = Top;
_oldHeight = Height;
 Top = Height = 0;
 WindowState = WindowState.Maximized;

规范化代码:

Top = _oldTop;
Height = _oldHeight;
WindowState = WindowState.Normal;
于 2010-06-18T16:35:04.563 回答