WPF彈出右鍵菜單時(shí)判斷鼠標(biāo)是否選中該項(xiàng)
和上篇在WPF的TreeView中實(shí)現(xiàn)右鍵選定一樣,這仍然是一個(gè)右鍵菜單的問題:
這個(gè)需求是在一個(gè)實(shí)現(xiàn)剪貼板的功能的時(shí)候遇到的:在彈出右鍵菜單時(shí),如果菜單彈出位置在ListViewItem中時(shí),我們認(rèn)為這項(xiàng)已經(jīng)被選中,可以使用剪貼板功能。

當(dāng)菜單彈出位置在ListView的空白處時(shí),我們一般認(rèn)為沒有項(xiàng)被選中,此時(shí)是不應(yīng)該使能剪貼板功能的。

但是這個(gè)時(shí)候,該項(xiàng)仍然是選中的。不能通過Item的IsSelected的屬性來區(qū)分這兩種情況。這樣,就需要我們加一個(gè)判斷鼠標(biāo)是否在所選的節(jié)點(diǎn)上的函數(shù)。實(shí)現(xiàn)這個(gè)功能的方式有如下兩種:
方法1:響應(yīng)ListView的PreviewMouseRightButtonDown事件,在其中判斷是否有節(jié)點(diǎn)被選中。還是直接上代碼吧:
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;
}這個(gè)其實(shí)就是一個(gè)命中測(cè)試的方面的問題,代碼還是比較基礎(chǔ)的,也沒有什么需要解釋的地方,但寫起來還是有點(diǎn)麻煩。
方法2:同時(shí)響應(yīng)ListView的PreviewMouseRightButtonDown事件和TreeViewItem的PreviewMouseRightButtonDown事件。
- 當(dāng)鼠標(biāo)點(diǎn)擊在ListViewItem上時(shí):發(fā)生的事件順序?yàn)?ListView_MouseDown 、ListViewItem_MouseDown。
- 當(dāng)鼠標(biāo)點(diǎn)擊在ListView外時(shí):發(fā)生的事件僅為 ListView_MouseDown 。
因此,只要在ListView_MouseDown 中設(shè)置isItemSelected = false,在ListViewItem_MouseDown中設(shè)置isItemSelected = true即可。由于非常簡(jiǎn)單,就不附代碼了。
使用上面的兩種方法后,就可以直接在剪切復(fù)制命令的CanExecute函數(shù)中通過isItemSelected來判斷是否該使能剪切復(fù)制命令了。
另外,這兩方法是針對(duì)ItemsControl類型的控件的,也就是說,在TreeView或ListBox等控件中也可以使用,如果把它們封裝一下就更方便了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用AutoUpdater.NET實(shí)現(xiàn)程序自動(dòng)更新
開發(fā)桌面應(yīng)用程序的時(shí)候,經(jīng)常會(huì)因?yàn)樾略龉δ苄枨蠡蛐迯?fù)已知問題,要求客戶更新應(yīng)用程序,在.Net體系中采用?AutoUpdater.NET?組件可以非常便捷的實(shí)現(xiàn)這一功能,需要的朋友可以參考下2024-02-02
深入C#任務(wù)管理器中應(yīng)用程序選項(xiàng)隱藏程序本身的方法詳解
本篇文章是對(duì)在C#任務(wù)管理器中應(yīng)用程序選項(xiàng)隱藏程序本身的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實(shí)現(xiàn)百度網(wǎng)站收錄和排名查詢功能思路及實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)百度網(wǎng)站收錄和排名查詢功能思路及實(shí)例,本文思路同樣適用必應(yīng)、搜狗、搜搜、360等搜索引擎,需要的朋友可以參考下2015-01-01
C#實(shí)現(xiàn)多線程的Web代理服務(wù)器實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)多線程的Web代理服務(wù)器,涉及C#多線程代理服務(wù)器的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
C#探秘系列(四)——GetHashCode,ExpandoObject
這篇繼續(xù)分享下GetHashCode和ExpandoObject這兩個(gè)比較好玩的方法。2014-05-05
WPF+ASP.NET SignalR實(shí)現(xiàn)后臺(tái)通知功能的示例代碼
本文以一個(gè)簡(jiǎn)單示例,簡(jiǎn)述如何通過WPF+ASP.NET SignalR實(shí)現(xiàn)消息后臺(tái)通知以及數(shù)據(jù)的實(shí)時(shí)刷新,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正2022-09-09

