Ошибка вторичного монитора: проблема в WPF или в графическом драйвере? - PullRequest
2 голосов
/ 21 апреля 2010

Я обнаружил странную ошибку в своем приложении WPF и пытаюсь определить, является ли это проблемой с WPF или моим графическим драйвером, чтобы я мог сообщить об этом в соответствующую компанию. У меня Quadro FX 1700 с последними драйверами (197.54) в системе Windows XP, на котором запущено приложение .NET 3.5 SP1.

У меня есть два монитора, мой основной слева и дополнительный справа. Проблема возникает, когда я максимизирую, а затем восстанавливаю дочернее окно главного окна на моем основном мониторе. Дочернее окно имеет правильный размер на основном мониторе, но оно рисуется на моем дополнительном мониторе, как если бы оно все еще было развернуто. Перемещение дочернего окна на основном мониторе перемещает его на вспомогательном.

Восстановленное дочернее окно отображается на дополнительном мониторе, как если бы оно все еще было развернуто http://i43.tinypic.com/ok94ex.png

Я сделал пример приложения (код ниже), который вызывает такое поведение.

  1. Запустите приложение и убедитесь, что главное окно находится на вашем основном мониторе.
  2. Дважды щелкните главное окно. Должно появиться зеленое дочернее окно.
  3. Щелкните по зеленому дочернему окну, чтобы развернуть его.
  4. Нажмите зеленое дочернее окно, чтобы восстановить.

Может кто-нибудь еще воспроизвести эту проблему? В моей системе зеленый дочерний элемент восстанавливается, но затем он рисуется на моем основном и дополнительном мониторах, а не только на основном мониторе.

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 ]

1 голос
/ 21 апреля 2010

Ваше приложение отлично работает в моей системе. У меня двойные мониторы, 3.5SP1, но у меня Radeon HD4670.

0 голосов
/ 18 июня 2010

ОК, сегодня я что-то пробую, и кажется, что проблема возникает, потому что максимизирующая активность расширяет ширину до второго монитора перед перемещением окна в верхний левый угол. Поэтому, когда вы нормализуете окно, расширенная часть все еще находится на втором мониторе и не будет очищена, пока вы не перетащите окно на второй монитор.

Чтобы обойти эту проблему, перед настройкой WindowState на Maximized сначала установите Width и Height на нули. Это решит проблему. Вы можете кэшировать текущие значения Top и Left, чтобы при нормализации окна оно возвращалось к предыдущей позиции:

Развернутый код:

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

Нормализованный код:

Top = _oldTop;
Height = _oldHeight;
WindowState = WindowState.Normal;
0 голосов
/ 17 июня 2010

У меня тоже такая же проблема. Я не думаю, что это проблема графической карты, потому что я попробовал ее на своем рабочем столе, а затем на своем ноутбуке с расширенным монитором и всегда вижу дополнительное развернутое окно на втором мониторе после нормализации реального окна. Если бы здесь использовалась графика, я бы сказал, что это связано с тем, что WPF не был разработан для совместимости со всеми графическими картами.

Это происходит только тогда, когда я использую настроенные кнопки увеличения / минимизации и устанавливаю WindowState на основе событий нажатия кнопки. Если я разверну окно, используя кнопки Windows по умолчанию, все в порядке. Я был разочарован поиском решения этой проблемы, поэтому я написал некоторый код для максимизации / нормализации путем изменения размера окна.

...