【问题标题】:Use current display scale in WPF ContextMenu在 WPF ContextMenu 中使用当前显示比例
【发布时间】:2019-07-08 13:34:56
【问题描述】:

我的 WPF 应用程序是 Per-Monitor Aware 并且通常可以很好地扩展。但是,当应用程序窗口位于第二个监视器上时,它的 scale=150% 并且我打开一个上下文菜单,它使用主显示中的 scale=100%,使菜单项变得非常小:

(有趣的是,子菜单项使用正确的 150% 比例)

我打开上下文菜单设置 IsOpen = true:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ContextMenu menu = new ContextMenu();

            menu.Items.Add("item 1");
            menu.Items.Add("item 2");

            MenuItem submenu = new MenuItem();
            submenu.Header = "submenu";
            submenu.Items.Add("more 1");
            submenu.Items.Add("more 2");
            menu.Items.Add(submenu);

            menu.IsOpen = true;
        }

如何配置上下文菜单以使用打开它的显示设置,而不是从默认的主显示?

【问题讨论】:

  • 您使用的是哪个 .NET 版本?从 4.6.2 开始,每个监视器默认启用 DPI 感知,请检查此thread
  • @PavelAnikhouski 我的应用程序面向 .NET Framework 4.7.2,我安装了 .NET Framework 4.8。
  • 这里有同样的问题。您找到解决方案/解决方法了吗?
  • @gReX 我还没有找到解决方案。

标签: wpf


【解决方案1】:

您可以通过 RenderTransform 撤消从 PrimaryScreen 的缩放和从 Visual Scale 到 dpiScale:

var visual = e.Source as Visual;
if (visual != null)
{
     var dpiScale = VisualTreeHelper.GetDpi(visual);
     System.Windows.Forms.Screen.PrimaryScreen.
           GetDpi(DpiType.Effective, out uint dpiX, out uint dpiY);
     menu.RenderTransform = 
          new ScaleTransform(dpiScale.DpiScaleX / ((double)dpiX / 96), 
                            dpiScale.DpiScaleY / ((double)dpiY / 96));
     menu.IsOpen = true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多