Окно WPF не может перерисовать содержимое в областях на Win10 с двумя мониторами - PullRequest
0 голосов
/ 02 марта 2019

Хорошо, во-первых, вот изображение, представляющее экран 4K и экран 1080p с мертвой зоной.Во-вторых, экран 4K настроен на 125% масштабирования.В-третьих, если 1080p также установлен на 125%, ошибка все еще происходит.Однако, если вы установите экран 4K обратно на 100%, то все будет работать как положено.

enter image description here

Если окно перемещается с помощью мыши на1080p работает как положено.Однако, если вы используете верхнюю и левую части окна для его перемещения, тогда возникает проблема.

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

Я не уверен, что является причиной этого, но кажется, что когда окно перемещается через верхнюю и левую стороны, оно не устанавливает должным образом отображающий дисплей, когдаосновной экран не в масштабе 100%.

Если вы хотите, чтобы в качестве примера был приведен код, то:

 public partial class Magnifier : Window
{
    public Magnifier()
    {
        InitializeComponent();
    }

    public void Update(D.Bitmap bmp, double x, double y)
    {
        Preview.Source = GetSource(bmp);

        Top = y;
        Left = x;
    }

    public static BitmapSource GetSource(System.Drawing.Bitmap source)
    {
        var rect = new System.Drawing.Rectangle(0, 0, source.Width, source.Height);

        var bitmapData = source.LockBits(
            rect,
            ImageLockMode.ReadWrite,
            System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        try
        {
            var size = (rect.Width * rect.Height) * 4;

            return BitmapSource.Create(
                source.Width,
                source.Height,
                source.HorizontalResolution,
                source.VerticalResolution,
                PixelFormats.Bgra32,
                null,
                bitmapData.Scan0,
                size,
                bitmapData.Stride);
        }
        finally
        {
            source.UnlockBits(bitmapData);
        }
    }
}

В приведенном выше коде x и y уже масштабированы доправильный DPI перед их передачей в метод Update.Окно действительно перемещается в ожидаемое место на обоих экранах.Несмотря на то, что у меня есть растровое изображение, я также проверил, просто пытаясь установить BackgroundColor.Он также не может обновиться в мертвой зоне.

Окно обновляется в DispatchTimer и работает, как и ожидалось, везде, кроме мертвой зоны.

Видеокарта: Nvidia 1080 GTX - последние версии драйверов

Я тестировал следующие версии .Net: 4.6, 4.7.1 и 4.7.2.

Есть какие-либо мысли или предложения по этому вопросу?Кто-нибудь еще сталкивался с этой проблемой?

Редактировать 1:

Мое подозрение действительно верно, окно не обновляет своего владельца / возможности дисплея на дополнительном экране, если расположено сверху и слева.

Я поместил окно при запуске в мертвую зону.Это не работает.Затем я схватил его мышью, и окно dpi отрегулировалось и настроилось на дополнительный дисплей.После этого все работало без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...