【问题标题】:wpf notifyicon context menu not centered on tray icon at 100% dpiwpf notifyicon 上下文菜单未以 100% dpi 的托盘图标为中心
【发布时间】:2015-03-30 02:29:33
【问题描述】:

我正在使用 wpf 通知图标 (http://www.hardcodet.net/wpf-notifyicon)

当我的笔记本电脑以 100% dpi 缩放时,上下文菜单的左侧以托盘图标为中心,正如预期的那样。

当笔记本电脑不是 100% 时,上下文菜单被推到最右边。

在高分辨率笔记本电脑显示器上,100% 缩放不是默认设置。

无论我的托盘图标在哪里,也就是说,无论离时钟有多远,菜单总是会随着时钟弹出,尽可能在屏幕的右下角,同时保持可见。

注意:我正在测试默认安装的 Windows 8.1。此外,我正在使用的 NotifyIcon 是通常推荐给任何尝试在 WPF 中使用托盘功能的人的图标。

重现:hardcodet 提供的无窗口示例中存在问题。我正在使用没有窗口的 wpf NotifyIcon,并且可以在代码或 xaml 中轻松重现。事实上,我无法停止复制它。当 dpi 缩放打开时会发生这种情况,即 1080p 显示器实际上显示的分辨率较低时,Windows 会这样做以阻止文本太小而无法阅读的应用程序。

关于如何使上下文菜单出现在预期位置而不考虑 dpi 的任何想法?

kennyzx 建议的屏幕截图:

良好的行为。红色背景上的 m (MEGAsync) 刚刚被右键单击

不良行为。绿色的勾号,我的通知图标,刚刚被右键单击,菜单随时出现

!good behaviour. the m on red background (MEGAsync) has just been right-clicked

!bad behaviour. the green tick, my notifyicon, has just been right-clicked and the menu appears over the clock

还有一些代码:

var n = new TaskbarIcon();
n.Icon=new System.Drawing.Icon(@"C:\window - 64 - tick.ico");
n.ContextMenu = new System.Windows.Controls.ContextMenu();
n.ContextMenu.Items.Add(new System.Windows.Controls.MenuItem {Header="E_xit" });

【问题讨论】:

  • 这最好用截图来说明。

标签: wpf dpi notifyicon


【解决方案1】:

在这里找到解决方案:http://www.codeproject.com/Messages/4929452/Problem-with-context-menu-position.aspx

感谢 codeproject 用户 Igorious:

获取 Wpf Notifyicon 的代码 (http://www.hardcodet.net/wpf-notifyicon))。

在 Hardcodet.Wpf.TaskbarNotification.TaskbarIcon.ShowContextMenu() 中

替换

ContextMenu.HorizontalOffset = cursorPosition.X;
ContextMenu.VerticalOffset = cursorPosition.Y;

var g = Graphics.FromHwnd(IntPtr.Zero);
var scaleX = g.DpiX / 96.0;
var scaleY = g.DpiY / 96.0;

ContextMenu.HorizontalOffset = cursorPosition.X / scaleX;
ContextMenu.VerticalOffset = cursorPosition.Y / scaleY;

解释(感谢codeproject用户游艇):

这是必需的,因为 WinApi.GetPhysicalCursorPos 以像素为单位返回鼠标位置, 但是 WPF 的测量单位是与设备无关的像素(根据定义,它是 1/96 英寸) 您需要通过 DPI(每英寸点数)设置调整 GetPhysicalCursorPos 的返回值, 否则如果用户设置的 DPI 不是默认的 96,上下文菜单的位置将不正确。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多