WPF彈出右鍵菜單時判斷鼠標(biāo)是否選中該項
和上篇在WPF的TreeView中實現(xiàn)右鍵選定一樣,這仍然是一個右鍵菜單的問題:
這個需求是在一個實現(xiàn)剪貼板的功能的時候遇到的:在彈出右鍵菜單時,如果菜單彈出位置在ListViewItem中時,我們認(rèn)為這項已經(jīng)被選中,可以使用剪貼板功能。
當(dāng)菜單彈出位置在ListView的空白處時,我們一般認(rèn)為沒有項被選中,此時是不應(yīng)該使能剪貼板功能的。
但是這個時候,該項仍然是選中的。不能通過Item的IsSelected的屬性來區(qū)分這兩種情況。這樣,就需要我們加一個判斷鼠標(biāo)是否在所選的節(jié)點上的函數(shù)。實現(xiàn)這個功能的方式有如下兩種:
方法1:響應(yīng)ListView的PreviewMouseRightButtonDown事件,在其中判斷是否有節(jié)點被選中。還是直接上代碼吧:
bool isItemSelected = false; private void ListView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) { object item = GetElementFromPoint((ItemsControl)sender, e.GetPosition((ItemsControl)sender)); isItemSelected = (item != null); } private object GetElementFromPoint(ItemsControl itemsControl, Point point) { UIElement element = itemsControl.InputHitTest(point) as UIElement; while (element != null) { if (element == itemsControl) return null; object item = itemsControl.ItemContainerGenerator.ItemFromContainer(element); if (!item.Equals(DependencyProperty.UnsetValue)) return item; element = (UIElement)VisualTreeHelper.GetParent(element); } return null; }
這個其實就是一個命中測試的方面的問題,代碼還是比較基礎(chǔ)的,也沒有什么需要解釋的地方,但寫起來還是有點麻煩。
方法2:同時響應(yīng)ListView的PreviewMouseRightButtonDown事件和TreeViewItem的PreviewMouseRightButtonDown事件。
- 當(dāng)鼠標(biāo)點擊在ListViewItem上時:發(fā)生的事件順序為 ListView_MouseDown 、ListViewItem_MouseDown。
- 當(dāng)鼠標(biāo)點擊在ListView外時:發(fā)生的事件僅為 ListView_MouseDown 。
因此,只要在ListView_MouseDown 中設(shè)置isItemSelected = false,在ListViewItem_MouseDown中設(shè)置isItemSelected = true即可。由于非常簡單,就不附代碼了。
使用上面的兩種方法后,就可以直接在剪切復(fù)制命令的CanExecute函數(shù)中通過isItemSelected來判斷是否該使能剪切復(fù)制命令了。
另外,這兩方法是針對ItemsControl類型的控件的,也就是說,在TreeView或ListBox等控件中也可以使用,如果把它們封裝一下就更方便了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用Socket實現(xiàn)發(fā)送和接收圖片的方法
這篇文章主要介紹了C#使用Socket實現(xiàn)發(fā)送和接收圖片的方法,涉及C#操作socket發(fā)送與接收文件的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04深入理解c# checked unchecked 關(guān)鍵字
本篇文章是對c#中的checked unchecked 關(guān)鍵字進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#解決SQlite并發(fā)異常問題的方法(使用讀寫鎖)
這篇文章主要介紹了C#解決SQlite并發(fā)異常問題的方法,通過使用讀寫鎖達(dá)到多線程安全訪問,進(jìn)而解決SQLite并發(fā)異常的問題,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07C#中DataTable 轉(zhuǎn)換為 Json的方法匯總(三種方法)
JavaScript Object Notation (Json)是一種輕量級的數(shù)據(jù)交換格式,下面小編給大家介紹三種方法實現(xiàn)DataTable轉(zhuǎn)換成 Json 對象,感興趣的朋友一起看看吧2016-11-11