奇怪的ComboBox行为-与DPI有关(?)

时间:2019-02-07 23:38:08

标签: c# .net wpf combobox gdi

我有一个WPF应用程序,可以在辅助显示中全屏打开另一个WPF窗口。我遇到的问题是,当我尝试获取辅助显示范围时,它们带有错误的值,例如:我的笔记本电脑显示器的分辨率为1920x1080,在我的应用中它是正确的,但是在辅助显示中,即一台分辨率为1920x1080的电视,则返回2400x1350

Image 1

代码:

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>

现在,组合框显示了预期的值,但是当我尝试启动窗口时,它们会出现在错误的位置: 数字应位于每个屏幕的中心,红色边框代表屏幕边界。

IMAGE 3

再次通过在app.manifest中启用GDI DPI缩放来“修复”它。

<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. 最重要/最严重的是,单击组合框时会“闪烁”,并且不允许您选择项目。

IMAGE 5

创建组合框

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

组合框填充(后面的代码):

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

0 个答案:

没有答案