[WPF]ListView點擊列頭排序功能實現

[WPF]ListView點擊列頭排序功能實現

這是一個非常常見的功能,要求也很簡單,在Column Header上顯示一個小三角表示表示現在是在哪個Header上的正序還是倒序就可以了。微軟的MSDN也已經提供了實現方式。微軟的方法中,是通過ColumnHeader Template實現的,一共要維護至少兩個Header Template,一個顯示正三角,一個顯示倒三角。在用戶點擊Header的時候同時切換使用的Template。如果你的ListView只提供Sort功能,這個方法就可以了。但是如果你的ListView還在在Header中提供Filter功能呢?如果還需要用戶可以配置是否開啟SortFilter功能呢?那么你就需要6Template來處理SortFilter的組合。如果在Header本來就有好幾種(文字Header、畫片Header等)或是要放入更多的功能呢?顯然微軟的這個方式只能用于技術演示(當然MSDN本來就是這個目的),面對實際項目時就會力不從心。Google搜索WPF ListView Sort,可以找到很多不同的實現方式。

1.?????? SwitchOnTheCode:使用Adorner Layer,重寫AdornerOnRender方法,畫出一個三角形。畫個三角可以,要畫個有發光、漸變、動畫效果的三角,代碼會變得很難維護。而且不能用Blend去編輯這個樣式。不過思路是很好的,因為它不會占用控件的現有的任何屬性,就不會有微軟的方式中功能組合的問題。

2.?????? Jeol Rumerman’s Blog:繼承GridViewColumn,擴展出Sort功能。還是用Header Template,更糟糕的是,為加一個功能而使用繼承本身就不是一個很好的設計。同理要加個Filter功能,是不是還要繼承出一個FilteredGridViewColumnFilteredAndSortedGridViewColumn呢?不僅要處理Template的組合,還會產生類膨脹,實在是不可取。

3.?????? CodeProject WPFListViewSorter:與微軟的方式一樣,只是通過自定義Sorter函數解決了微軟的方式中,把Column Header上的名字,當作Sort Property的問題。

4.?????? Thejoyofcode:通過Attached Property解決了同樣的問題,而且沒有界面顯示的實現。而且還繼承出了一個SortableListView。缺點就不再解釋了。

5.?????? Marlongrech:提供了Disable/Enable Sort功能。不過也是用HeaderTemplate做界面實現。(突然發現Wordpress可以訪問了)

沒有找到一個滿足我要求的實現方式,每個解決方案都只是關注于自己要解決的問題的那一個點上。當然在Blog里讓示例簡單一些也沒有錯。那就讓我把他們所解決的問題集成到一個示例中。要求也不多。

1.?????? 不影響現有功能。

2.?????? 不獨占現有屬性。

3.?????? 使用組合,而不是繼承。

第一個方案,使用Adorner Layer是個很好的思路,Adorner Layer相當于一個畫板,我畫在這里,別的功能畫在那里就是了,所以不會影響現有功能也不算獨占現有屬性。它的示例中占用了Tag來描述使用哪個屬性排序。我們用Attached Property替換掉就可以了。然后就剩下一個問題了——不要畫三角。我們想用Template。這樣不同的地方的樣子可以有不一樣的界面效果而又不用修改代碼。但是問題是Adorner是沒有Template的。

參考了兩篇關于Adorner Layer的文章。

1.?????? Adorners in WPF

2.?????? Visual Level Programming vs Logical Level Programming

寫了一個晚上的代碼,終于搞出一個自我感覺良好的實現出來。在ListView上添加Sort功能,只需要添加一個Attached Property就可以。代碼如下。

?

復制代碼
Add Sort to ListView

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

天池幸福感的數據處理_了解幸福感與數據(第1部分)

天池幸福感的數據處理In these exceptional times, the lockdown left many of us with a lot of time to think. Think about the past and the future. Think about our way of life and our achievements. But most importantly, think about what has been and would be ou…

標線markLine的用法

series: [{markLine: {itemStyle: {normal: { lineStyle: { type: solid, color:#000 },label: { show: true, position:left } }},data: [{name: 平均線,// 支持 average, min, maxtype: average},{name: Y 軸值為 100 的水平線,yAxis: 100},[{// 起點和終點的項會共用一個 na…

php pfm 改端口,羅馬2ESF和PFM 修改建筑 軍團 派系 兵種等等等很多東西的教程

本帖最后由 clueber 于 2013-10-5 12:30 編輯本人是個羅馬死忠加修改黨,恩,所以分享一下自己的修改心得修改工具為ESF1.0.7和PFM3.0.3首先是ESF修改。ESF可以用來改開局設定和存檔,修改開局設定是startpos.esf文件,在存檔在我這里…

紅草綠葉

從小到大喜歡陰天,喜歡下雨,喜歡那種潮濕的感覺。卻又絲毫容不得腳上有一絲的水汽,也極其討厭穿涼鞋。小時候特別喜歡去山上玩,偷桃子柿子,一切一切都成了美好的回憶,長大了,那些事情就都不復存…

wpf listview 使用

單列&#xff1a; <ListView Grid.Column"1" Height"284" HorizontalAlignment"Left" Margin"64,73,0,0" Name"listView1" VerticalAlignment"Top" Width"310" > <ListView.Items…

php 獲取當天到23 59,js 獲取當天23點59分59秒 時間戳 (最簡單的方法)

原生Ajax 和Jq Ajax前言:這次介紹的是利用ajax與后臺進行數據交換的小例子,所以demo必須通過服務器來打開.服務器環境非常好搭建,從網上下載wamp或xampp,一步步安裝就ok,然后再把寫好的頁面放在服務器中指定的 ...『TCP&sol;IP詳解——卷一&#xff1a;協議』讀書筆記——1…

詹森不等式_注意詹森差距

詹森不等式背景 (Background) In Kaggle’s M5 Forecasting — Accuracy competition, the square root transformation ruined many of my team’s forecasts and led to a selective patching effort in the eleventh hour. Although it turned out well, we were reminded t…

【轉載】儒林外史人物——荀玫

寫在前面&#xff1a;本博客內容為轉載&#xff0c;原文URL&#xff1a;http://blog.sina.com.cn/s/blog_9132ac5b0101iukw.html 說完周進&#xff0c;本應順著說范進&#xff0c;但我覺得荀玫他們村的事情過于喜感&#xff0c;想先說荀玫。 荀玫簡直是儒林中的某類標桿人物&am…

WebM VP8 SDK Usage/關于WebM VP8 SDK的用法

WebM是Google提出的新的網絡視頻格式&#xff0c;本質上是個MKV的殼&#xff0c;封裝VPX中的VP8視頻流與Vorbis OGG音頻流。目前Firefox、Opera、Chrome都能直接打開WebM視頻文件而無需其他任何亂七八糟的插件。我個人倒是很喜歡WebM的OGG音頻&#xff0c;雖然在低比特率下不如…

數據分析師 需求分析師_是什么讓分析師出色?

數據分析師 需求分析師重點 (Top highlight)Before we dissect the nature of analytical excellence, let’s start with a quick summary of three common misconceptions about analytics from Part 1:在剖析卓越分析的本質之前&#xff0c;讓我們從第1部分中對分析的三種常…

JQuery發起ajax請求,并在頁面動態的添加元素

頁面html代碼&#xff1a; <li><div class"coll-tit"><span class"coll-icon"><iclass"sysfont coll-default"></i>全域旅游目的地</span></div><div class"coll-panel"><div c…

arcgis鏡像圖形工具,ArcGis圖形編輯

一、編輯工具條介紹二、草圖工具介紹Sketch Tool&#xff1a;使用草圖工具來創建點要素或是線或面要素的節點。雙擊或是F2鍵結束草圖狀態&#xff0c;轉化為要素。Intersection Tool&#xff1a;使用相交工具在兩個線要素相交(或延長相交)的地方創建一個節點。如圖&#xff1a;…

MAYA插件入門

我們知道&#xff0c; MAYA 是一個基于結點的插件式軟件架構&#xff0c;這種開放式的軟件架構是非常優秀的&#xff0c;它可以讓用戶非常方便地在其基礎上開發一些自已想要的插件&#xff0c;從而實現一些特殊的功能或效果。 在MAYA上開發自已的插件&#xff0c;你有3種選擇&a…

(原創) 如何使用C++/CLI讀/寫jpg檔? (.NET) (C++/CLI) (GDI+) (C/C++) (Image Processing)

Abstract因為Computer Vision的作業&#xff0c;之前都是用C# GDI寫&#xff0c;但這次的作業要做Grayscale Dilation&#xff0c;想用STL的Generic Algorithm寫&#xff0c;但C Standard Library并無法讀取jpg檔&#xff0c;用其它Library又比較麻煩&#xff0c;所以又回頭想…

貓眼電影評論_電影的人群意見和評論家的意見一樣好嗎?

貓眼電影評論Ryan Bellgardt’s 2018 movie, The Jurassic Games, tells the story of ten death row inmates who must compete for survival in a virtual reality game where they not only fight each other but must also fight dinosaurs which can kill them both in th…

128.Two Sum

題目&#xff1a; Given an array of integers, return indices of the two numbers such that they add up to a specific target. 給定一個整數數組&#xff0c;返回兩個數字的索引&#xff0c;使它們相加到特定目標。 You may assume that each input would have exactly on…

php獲取錯誤信息函數,關于php:如何獲取mail()函數的錯誤消息?

我一直在使用PHP mail()函數。如果郵件由于任何原因未發送&#xff0c;我想回顯錯誤消息。 我該怎么做&#xff1f;就像是$this_mail mail(exampleexample.com, My Subject, $message);if($this_mail) echo sent!;else echo error_message;謝謝&#xff01;當mail()返回false時…

關于夏季及雷雨天氣的MODEM、路由器使用注意事項

每年夏季是雷雨多發季節&#xff0c;容易出現家用電腦因而雷擊造成電腦硬件的損壞和通訊故障&#xff0c;為了避免這種情況的的發生&#xff0c;保護您的財產不受損失&#xff08;一般雷擊照成損壞的設備是沒得保修的&#xff09;&#xff0c;建議您繼續閱讀下面內容&#xff1…

創建Console應用程序,粘貼一下代碼,創建E://MyWebServerRoot//目錄,作為虛擬目錄,親自測試通過,

創建Console應用程序&#xff0c;粘貼一下代碼&#xff0c;創建E://MyWebServerRoot//目錄&#xff0c;作為虛擬目錄&#xff0c;親自測試通過&#xff0c; 有一個想法&#xff0c;調用ASP.DLL解析ASP&#xff0c;可是始終沒有找到資料&#xff0c;有待于研究&#xff0c;還有…