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

辅助监视器错误:WPF或图形驱动程序中存在问题?,wpf,driver,multiple-monitors,Wpf,Driver,Multiple Monitors,我发现我的WPF应用程序有一个奇怪的bug,我正试图确定这是WPF还是我的图形驱动程序的问题,以便我可以向相应的公司报告。我有一个装有最新驱动程序(197.54)的Quadro FX 1700,在Windows XP系统上运行.NET 3.5 SP1应用程序 我有两个显示器,我的主显示器在左边,次显示器在右边。当我在主监视器上最大化然后还原主窗口的子窗口时,就会出现问题。子窗口在主监视器上的大小正确,但在我的辅助监视器上绘制,就好像它仍然被最大化一样。在主监视器上移动子窗口会在次监视器上移动它

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

我有两个显示器,我的主显示器在左边,次显示器在右边。当我在主监视器上最大化然后还原主窗口的子窗口时,就会出现问题。子窗口在主监视器上的大小正确,但在我的辅助监视器上绘制,就好像它仍然被最大化一样。在主监视器上移动子窗口会在次监视器上移动它

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

  • 启动应用程序并确保主窗口位于主监视器上
  • 双击主窗口。应显示一个绿色的子窗口
  • 单击绿色子窗口以最大化
  • 单击要还原的绿色子窗口
  • 其他人能重现这个问题吗?在我的系统上,绿色子级会恢复,但它会同时在主监视器和辅助监视器上绘制,而不仅仅是在主监视器上绘制

    App.xaml Shell.xaml DialogWindow.xaml
    你的应用程序在我的系统上运行良好。我正在运行双监视器,3.5SP1,但我有一个Radeon HD4670。

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


    只有在使用自定义的最大化/最小化按钮并根据按钮单击事件设置Windows状态时,才会发生这种情况。如果使用Windows默认按钮最大化窗口,则一切正常。我对找到这个问题的解决方案感到沮丧,因此我编写了一些代码,通过更改窗口大小来进行最大化/规范化。

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

    要解决此问题,请先将“宽度”和“高度”设置为零,然后再将“窗口状态”设置为“最大化”。这将解决问题。您可能希望缓存当前的“顶部”和“左侧”,以便在规范化窗口时,它会返回到上一个位置:

    最大化代码:

     _oldTop = Top;
    _oldHeight = Height;
     Top = Height = 0;
     WindowState = WindowState.Maximized;
    
    Top = _oldTop;
    Height = _oldHeight;
    WindowState = WindowState.Normal;
    
    规范化代码:

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

    这听起来像是图形卡驱动程序中的错误。看看它们是否过时。我今天刚刚更新到最新版本(见第一段)。谢谢你测试Dave。我向NVIDIA.np提交了一份报告,希望你能解决它!
    <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" />
    
    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;
               }
            }
        }
    }
    
     _oldTop = Top;
    _oldHeight = Height;
     Top = Height = 0;
     WindowState = WindowState.Maximized;
    
    Top = _oldTop;
    Height = _oldHeight;
    WindowState = WindowState.Normal;