2015-01-30 4 views
0

Я использую МОФ NotifyIcon (http://www.hardcodet.net/wpf-notifyicon)МОФ NotifyIcon контекстное меню не центрированы на иконке в трее на 100% точек на дюйм

Когда мой ноутбук на 100% масштабирования точек на дюйм, левая сторона контекстного меню по центру значок лотка, как и ожидалось.

Когда ноутбук не на 100%, контекстное меню перемещается в крайнее правое положение.

На дисплеях для ноутбуков с высоким разрешением, 100% масштабирование не является значением по умолчанию.

Везде, где расположен значок моего подноса, то есть, хотя и далеко от часов, меню всегда появляется над часами, насколько это возможно в правом нижнем углу экрана, если это возможно, оставаясь видимым.

Примечание: Я тестирую стандартную установку Windows 8.1. Кроме того, NotifyIcon, который я использую, является тем, который обычно рекомендуется для тех, кто пытается использовать лоток в WPF.

Воспроизведение: проблема существует в примере без окон, предоставленном hardcodet. Я использую wpf NotifyIcon без окна и могу легко воспроизводить код или xaml. На самом деле я не могу перестать воспроизводить его. Это происходит, когда масштабирование dpi масштабируется, то есть когда дисплей 1080p фактически демонстрирует меньшее разрешение, что делает окна, чтобы остановить приложения, которые слишком малы для чтения.

Любые идеи о том, как я могу создать контекстное меню в ожидаемом месте, независимо от того, что вы используете?

снимки экрана, как предложенные 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" }); 
+1

это лучше иллюстрируется скриншотом. – kennyzx

ответ

0

Найдено решение здесь: http://www.codeproject.com/Messages/4929452/Problem-with-context-menu-position.aspx

Это, с благодарностью пользователя CodeProject Igorious:

Получить код для МОФ 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 дюйма) Вам нужно отрегулировать возвращаемое значение GetPhysicalCursorPos с помощью установки DPI (точек на дюйм), , иначе позиция контекстного меню будет некорректным, если пользователи установят DPI, отличный от значения по умолчанию 96.

Смежные вопросы