wpf - 在 WPF ContextMenu 中使用当前显示比例
问题描述
我的 WPF 应用程序是 Per-Monitor Aware 并且通常可以很好地扩展。但是,当应用程序窗口位于第二个监视器上时,比例 = 150% 并且我打开一个上下文菜单,它使用主显示的比例 = 100%,使菜单项非常小:
我打开上下文菜单设置 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;
}
如何配置上下文菜单以使用它打开的显示设置,而不是从默认的主显示?
解决方案
您可以 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;
}