| 分類(lèi): 學(xué)習資料-分享 |
WPF的ContextMenu沒(méi)有類(lèi)似WinForm里面ContextMenu.SourceControl的概念,但是你可以通過(guò)ContextMenuService的GetPlacementTarget方法來(lái)獲取類(lèi)似的效果。
很多時(shí)候,我們會(huì )希望在WPF的資源文件里面定義一個(gè)通用的右鍵彈出菜單,然后將這個(gè)菜單通過(guò)定義在各個(gè)控件的ContextMenu屬性來(lái)設置用戶(hù)右擊控件時(shí)彈出菜單。然而因為WPF的一些設計不足,你不能在右鍵菜單的點(diǎn)擊事件處理函數中獲知右鍵菜單彈出時(shí),鼠標的焦點(diǎn)是在哪個(gè)控件上?例如下面的代碼:
XAML代碼:
<</span>Window.Resources>
</</span>Window.Resources>
<</span>TreeView>
</</span>TreeView>
<</span>DockPanel
</</span>DockPanel>
C#代碼:
這種情況下你可以通過(guò)ContextMenuService的GetPlacementTarget方法來(lái)獲取類(lèi)似的效果。
然而,看起來(lái)WPF在MenuItem.Click事件處理上面有一點(diǎn)bug,就是你不能通過(guò)(sender asMenuItem).ContextMenu
獲取到點(diǎn)擊的右鍵菜單,只好求助于LogicalTreeHelper.GetParent方法了,
使用下面的方法獲取到ContextMenu的Owner:
ContextMenuService.GetPlacementTarget(LogicalTreeHelper.GetParent(senderas MenuItem))
也就是說(shuō)上面的C#代碼改成下面的樣子就可以了:
聯(lián)系客服