辅助监视器错误:WPF或图形驱动程序中的问题?

时间:2010-04-21 14:59:25

标签: wpf drivers multiple-monitors

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

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

Restored child window is drawn on secondary monitor as if it were still maximized http://i43.tinypic.com/ok94ex.png

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

  1. 启动应用程序并确保主窗口位于主监视器上。
  2. 双击主窗口。应该出现一个绿色的儿童窗口。
  3. 单击绿色子窗口以最大化。
  4. 单击绿色子窗口进行还原。
  5. 其他人可以重现这个问题吗?在我的系统上,绿色孩子恢复,但随后它在我的主要和辅助监视器上绘制,而不仅仅是主监视器。

    的App.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" />
    

    App.xaml.cs

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

    Shell.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();
            }
        }
    }
    

    DialogWindow.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;
               }
            }
        }
    }
    

3 个答案:

答案 0 :(得分:1)

您的应用在我的系统上正常运行。我正在运行双显示器,3.5SP1,但我有一台Radeon HD4670。

答案 1 :(得分:0)

我也有同样的问题。我不认为这是一个图形卡问题,因为我在我的桌面上尝试了它,然后我的笔记本电脑使用扩展显示器,并且在标准化真实窗口后总是在第二个显示器上看到额外的最大化窗口。如果这里涉及图形,我会说它涉及WPF不能与所有图形卡兼容的方式。

仅当我使用自定义最大化/最小化按钮并根据按钮单击事件设置WindowState时,才会发生这种情况。如果我使用Windows默认按钮最大化窗口,一切都很好。我对找到这个问题的解决方案感到很沮丧所以我写了一些代码来通过改变窗口大小来实现最大化/规范化。

答案 2 :(得分:0)

好的,我今天尝试了一下,似乎问题就出现了,因为在将窗口移动到左上角之前,最大化活动将宽度扩展到第二个监视器。因此,在规范化窗口时,扩展部分仍在第二个监视器中,并且在将窗口拖动到第二个监视器之前不会清除。

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

最大化代码:

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

规范化代码:

Top = _oldTop;
Height = _oldHeight;
WindowState = WindowState.Normal;