2015-01-30 8 views
0

나는 WPF의 notifyicon

내 노트북이 100 % dpi의 확장에있다 (http://www.hardcodet.net/wpf-notifyicon)

를 사용하고 100 % dpi로 트레이 아이콘을 중심으로하지, 상황에 맞는 메뉴의 왼쪽을 중심으로 예상대로 트레이 아이콘

랩톱이 100 %가 아닌 경우 상황에 맞는 메뉴가 맨 오른쪽으로 밀려납니다.

고해상도 랩톱 디스플레이에서 100 % 배율이 기본값이 아닙니다.

내 트레이 아이콘이 놓여있는 위치, 즉 시계와 거리가 먼 곳이라면 언제나 메뉴가 항상 보이지 않는 채로 가능한 한 화면의 오른쪽 하단까지 항상 시계 모양으로 나타납니다.

참고 : Windows 8.1의 기본 설치를 테스트하고 있습니다. 또한 NotifyIcon은 WPF에서 트레이 기능을 시도하는 모든 사용자에게 일반적으로 권장되는 NotifyIcon입니다.

재현 대상 : 하드 코드가 제공하는 창없는 샘플에 문제가 있습니다. 나는 창없이 wpf NotifyIcon을 사용하고 코드 나 xaml에서 쉽게 재생산 할 수있다. 사실, 나는 그것을 재현하는 것을 멈출 수 없다. 이 기능은 dpi 스케일링이 켜져있을 때, 즉 1080p 디스플레이가 실제로 해상도가 낮을 ​​때 발생합니다. 즉, 윈도우가 너무 작아서 읽을 수없는 텍스트가있는 응용 프로그램을 멈추게하는 경우입니다.

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" }); 
+1

이것은 스크린 샷으로 더 잘 설명됩니다. – kennyzx

답변

0

여기에 솔루션을 찾았 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()

에서

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; 

설명과

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

(덕분에 사용자 요트를 CodeProject의에) 대체 :

그것은이다 WinApi 때문에 필요합니다.GetPhysicalCursorPos는 픽셀의 마우스 위치를 반환하지만 WPF의 측정 단위는 장치 독립 픽셀입니다 (정의 : 1/96 인치) GetPhysicalCursorPos의 반환 값을 DPI (dots per inch) 설정 인 으로 조정해야합니다. 그렇지 않으면 위치 사용자가 기본 96 이외의 DPI를 설정하면 상황에 맞는 메뉴가 올바르지 않습니다.