在WPF上下文菜单中使用当前显示比例

r1zk6ea1  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(150)

我的WPF应用程序是Per-Monitor Aware,通常扩展良好。但是,当应用程序窗口在第二个显示器上,scale=150%,我打开一个上下文菜单时,它使用主显示屏的scale=100%,使菜单项非常小:
x1c 0d1x(有趣的是,这些项目使用了正确的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;
        }

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

pxyaymoc

pxyaymoc1#

您可以使用RenderTransform来撤消从PrimaryScreen的Scaling和从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;
}
ergxz8rk

ergxz8rk2#

对于任何人谁仍然有这个问题,这里是一个解决方案:将contextmenu的PlacementTarget设置为具有正确dpi比例的父控件。
来源(无关联):https://blog.lindexi.com/post/WPF-%E4%BF%AE%E5%A4%8D-ContextMenu-%E5%9C%A8%E5%BC%80%E5%90%AF-PerMonitorV2-%E5%90%8E%E6%89%80%E7%94%A8-DPI-%E9%94%99%E8%AF%AF.html

相关问题