Странное поведение ComboBox - DPI связано (?) - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть приложение WPF, которое открывает другое окно WPF в полноэкранном режиме на дополнительном дисплее.Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь получить границы вторичного дисплея, они приходят с неправильными значениями, например: мой дисплей ноутбука имеет разрешение 1920x1080, и в моем приложении это правильно, но на вторичном дисплее, то естьтелевизор с разрешением 1920x1080, он возвращает 2400x1350

Image 1

CODE:

foreach (var monitor in System.Windows.Forms.Screen.AllScreens)
{ 
    i++;
    if (monitor.Primary) 
    { 
        cbMonitors.Items.Add("Monitor (Primary) " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString()); 
    }
    else 
    {
        cbMonitors.Items.Add("Monitor " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString()); 
    }
}
cbMonitors.SelectedIndex = 0;

После просмотра Интернета я обнаружил, что проблема была вызванамасштабирование экрана моего ноутбука

IMAGE 2

и исправлено, создав файл app.manifest и добавив / раскомментировав следующие строки:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>      

        <!-- fallback for Windows 7 and 8 -->
        <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>

        <!-- falls back to per-monitor if per-monitor v2 is not supported -->
        <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness>

    </windowsSettings>
</application>

Теперь ComboBox показываетпредполагаемые значения, но когда я пытаюсь запустить окна, они появляются в неправильных местах: число должно быть в центре каждого экрана, а красная граница представляет границы экрана.

IMAGE 3

Еще раз "исправил" это, включив масштабирование GDI DPI в app.manifest

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>

      <!-- fallback for Windows 7 and 8 -->
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>

      <!-- falls back to per-monitor if per-monitor v2 is not supported -->
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness>

      <!-- enables GDI DPI scaling -->
      <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>

    </windowsSettings>
</application>

IMAGE 4

Но теперь у меня возникают другие проблемы, и я не могу их исправить.

  1. Теперь границы экрана моего ноутбука (с масштабом 125%) отображаются неправильно, а границы телевизора правильные.

  2. Форма - это все "размыто "

  3. И самое важное / серьезное - это то, что ComboBox" щелкает "при нажатии и не позволяет выбрать элемент.

IMAGE 5

Создание ComboBox

<ComboBox Name="cbMonitors" HorizontalAlignment="Left" Margin="169,244,0,0" VerticalAlignment="Top" Width="506" />

Заполнение ComboBox (код сзади):

int i = 0;
foreach (var monitor in System.Windows.Forms.Screen.AllScreens)
{
    i++;
    if (monitor.Primary) { cbMonitors.Items.Add("Monitor (Primary) " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString()); }
    else { cbMonitors.Items.Add("Monitor " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString()); }

}
cbMonitors.SelectedIndex = 0;

И код, используемый для установки позиций окна

System.Windows.Forms.Screen s = System.Windows.Forms.Screen.AllScreens[number];
System.Drawing.Rectangle r = s.Bounds;
Top = r.Top;
Left = r.Left;
Height = s.Bounds.Height;
Width = s.Bounds.Width;

Также, если необходимо, вот полный исходный код моего приложения: https://mega.nz/#!iZ1kCApa!0yAfWY5PDUqdVGzcetbaXZFnb-tdAWmW4WUkYw6KIhI

...