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