在WPF ContextMenu中使用当前的显示比例

3
我的WPF应用程序是支持Per-Monitor的,通常可以很好地进行缩放。但是当应用程序窗口位于一个比例为150%的第二个显示器上时,如果我打开上下文菜单,它将从主显示器使用比例为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感知默认启用,请查看此线程 - Pavel Anikhouski
@PavelAnikhouski 我的应用程序针对 .NET Framework 4.7.2,而我已经安装了 .NET Framework 4.8。 - Sergey Vlasov
这里也有同样的问题。你找到解决方案/变通方法了吗? - gReX
@gReX 我还没有找到解决方案。 - Sergey Vlasov
2个回答

0

0

您可以使用RenderTransform将PrimaryScreen的缩放还原,并将其缩放到Visual的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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接