【WinUI3】ListView / GridView 學習總結

来源:https://www.cnblogs.com/rocael/archive/2022/09/30/16744135.html
-Advertisement-
Play Games

前言 WPF 的 ComboBox 控制項等綁定 enum 值很繁瑣,很讓人頭疼,網上也有提供了一些方法,基本是使用 ObjectDataProvider 方式和 MarkupExtension 方式, 有沒有辦法綁定值為 enum 類型就自動載入所有枚舉值選項,下麵記錄一種方法; 實現方式 主要通過 ...


簡述

官方對List view和Grid view的描述是:

The feature-rich ListView and GridView controls work out of box. They require no customization, but they can be customized easily. Each has its own built-in UI and UX and is designed to display nearly any type of collection as is.

翻譯過來也就說,這兩個容器功能非常豐富,他們不需要定製,但自定義內容也很簡單。每一個都有自己內置的UI和UX,並且能被用以表現所有類型集合。

UI的排布是X、Y軸的佈局,那麼縱向列表和網格確實能表達幾乎所有集合這話並非不妥。

另外,列表和網格還具有“相同樣式不同數據的重覆子件”的特殊重覆性,這意味著,其往往是和數據強綁定的。

設計者只需要關註其子件樣式即可。

綁定數據和手動添加數據

ListViewGridView使用屬性itemsSource來綁定數據,或者通過在標簽內添加item來添加數據。

但是二者是相互衝突的。

列表和網格的優先順序是[itemsSource > items],這意味著當綁定數據後,手動添加在XAML的item將會被忽視。

如何綁定數據:

<ListView itemsSource="{x:Bind ViewModel.Datas} />

佈局

預設的,ListView使用ItemsStackPanel作為佈局容器;GridView則預設使用ItemsWrapGrid

相信兩個名字並不讓人陌生。

自然,他們的佈局容器是可以自定義的。

但是自定義之前,官方有提到一點註意事項:

If you change ItemsPanel, do not disable virtualization. Both ItemsStackPanel and ItemsWrapGrid support virtualization, so these classes are safe to use. If you use any other panel, you might disable virtualization and slow the performance of the list view. For more info, see the list view articles under Performance.

翻譯過來就是,當你改變ItemsPanel(也就是佈局容器,或者子件面板)的時候,不要關閉虛擬化。無論是棧面板還是行面板,都是支持虛擬化的,都是可以安全的使用的。而當你使用其他的面板的時候,你可以關閉虛擬化來減少這些視圖的性能損耗。

再翻譯一下就是:這兩個容器是安全的!你沒有必要特地關閉虛擬化!但是你也可以在任何情況下關閉虛擬化來達到降低性能損耗的目的!

以ListView為例。

1)改變StackPanel的佈局方向為水平

<ListView Height="80">
      <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

2)滾動條設置

可以通過修改ListView的ScrollViewer屬性來自定義滾動條的狀態。

  • ScrollViewer.HorizontalScrollMode:水平滾動條啟動或關閉(Disable, Enable)
  • ScrollViewer.HorizontalScrollBarVisibility:水平滾動條的可見(Auto,Disable,Hidden,Visible)
  • ScrollViewer.VerticalScrollMode:垂直的
  • ScrollViewer.VerticalScrollBarVisibility:垂直的
<ListView Height="60"
          ScrollViewer.HorizontalScrollMode="Enabled"
          ScrollViewer.HorizontalScrollBarVisibility="Auto"
          ScrollViewer.VerticalScrollMode="Disabled"
          ScrollViewer.VerticalScrollBarVisibility="Hidden">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <x:String>Strawberry</x:String>
</ListView>

在設置ListView為水平佈局的時候,可以通過限定listview的寬度來使得滾動功能可用。

交互:選中和點擊

ListView具有兩個屬性:SelectionMode、IsItemClickEnable

開發者通過修改SelectionMode屬性來改變List的選中模式。

None:無選中樣式,列表為只讀狀態。

Single:只能選中一個。Ctrl+點擊可以取消選中;選中事件觸發時,能得到一個SelectedItem,且SelectedIndex有效。如果沒有選中,則前者是Null,後者是-1。此外,如果手動設置一個不在數據中的item,那麼其會被忽視,SelectedItem仍然為null。而如果設置一個SeletedIndex超過了數據的最大索引,那麼會拋出ArgumentException異常。

Multiple:多選;Shift+點擊可以範圍多選;使用SelectedItems獲取選中項。他和SeletedIndex、SeletedItem是同步的。另外,SeletedItem和eSeletedIndex是第一個選中的項。

Extended:拓展的;基本同Multiple。

當SelectionMode不為None且IsItemClickEnable不為False,那麼“選中”和“點擊”都會觸發事件。

觸發順序是先觸發點擊事件,再觸發選中事件。

如果點擊事件需要另一個頁面的載入後才能捕捉到,那麼點擊事件不會觸發,子件不會被選中。

如何添加選中事件:

<ListView x:Name="listView1" SelectionMode="Multiple"
          SelectionChanged="ListView1_SelectionChanged">
</ListView>

然後在cs中定義事件方法void ListView1_SelectionChanged(object sender, SelectionChangedEventArgs e);

如何添加點擊事件:

<ListView SelectionMode="None"
          IsItemClickEnabled="True"
          ItemClick="ListView1_ItemClick">
</ListView>

然後在cs中定義事件方法:
void ListView1_ItemClick(object sender, ItemClickEventArgs e)

選擇API

在代碼中,可以通過API對ListView進行操作:

var listview = new ListView();
...
// 全選
listview.SelectAll();

// 範圍選擇
listview.SelectRange(new ItemIndexRange(0, (uint)listview.Items.Count));

// 範圍取消選擇
listview.DeselectRange(new ItemIndexRange(0, (uint)listview.Items.Count));

參考內容

Microsoft 設計文檔


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 tkinter:GUI桌面應用開發模塊,寫軟體界面你還可以打包成exe軟體, 哪怕你沒有python環境, 一樣可以用雖然不一定要有界面, 但是有界面, 用戶體驗很棒… 環境使用 Python 3.8 Pycharm 模塊使用 import tkinter import webbrowser ...
  • 1、無論是淺拷貝還是深拷貝,拷貝對象後是否會開闢新記憶體,取決於被拷貝對象的數據類型是否可變,一般來講,可變的數據類型會開闢新記憶體,不可變數據類型反之不會開闢新記憶體,進行記憶體地址的引用(-5-256以外的大整數池會開闢記憶體,但我本地進行測試比較記憶體還是一樣的,有問題) 2、要在單層、嵌套型對象中逐一比 ...
  • 前言 環境使用 Python 3.8 Pycharm 模塊使用 import requests —> 數據請求模塊 pip install requests import parsel —> 數據解析模塊 pip install parsel from selenium import webdriv ...
  • Java Hutool 包工具類推薦 ExcelUtil 包引入 hutool包版本號可根據實際情況更換 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.4.M1</ ...
  • 總結: ArrayList與Vector集合的底層都是通過Object[] elementData數組存放對象的 ArrayList使用無參構造器時,初始容量為0,當存放一個對象後,容量擴容為10,此後按1.5*當前容量進行擴容 ArrayList使用帶參構造器時,初始容量為設定值,當存放對象個數達 ...
  • 1.List集合概要 2.Iterable介面 1.概要 2.重要方法 forEach方法:對Collection集合中的每個對象進行消費 List<Student> list = Stream.generate(() -> new Student("張三", 23)).limit(100).col ...
  • Servlet4.0 Response對象Response對象封裝Server返回Client的所有信息。在HTTP協議中,Server傳達給Client信息轉換到HTTP Header或者HTTP BODY中。5.1 Buffering緩衝區Serverlet Container可以但不強制緩衝發 ...
  • 我們在創建條形碼時,如果以圖片的方式將創建好的條碼保存到指定文件夾路徑,可以在程式中直接載入圖片使用;已生成的條碼圖片,需要通過讀取圖片中的條碼信息,如條碼類型、條碼繪製區域在圖片中的四個頂點坐標位置等,可參考本文中的方法。 註:讀取時,也支持讀取二維碼類型。 引入dll 調用API:Spire.B ...
一周排行
    -Advertisement-
    Play Games
  • public static void GetRegistData() { string name = "huishuangzhu"; //搜索到註冊表根目錄 RegistryKey hkml = Registry.ClassesRoot; //搜索到註冊表根目錄下的XXX文件夾。 RegistryK ...
  • 用acme.sh自動部署功能變數名稱證書 安裝ACME 目前使用量最大的免費SSL證書就是Let’s Encrypt,自2018-03開始,Let’s Encrypt官方發佈上線了免費的SSL泛功能變數名稱證書,目前通過DNS方式獲取比較快,國內可以通過鵝雲的DNSPod功能變數名稱API或者貓雲功能變數名稱API自動簽發Let’ ...
  • 經常看到有群友調侃“為什麼搞Java的總在學習JVM調優?那是因為Java爛!我們.NET就不需要搞這些!”真的是這樣嗎?今天我就用一個案例來分析一下。 昨天,一位學生問了我一個問題:他建了一個預設的ASP.NET Core Web API的項目,也就是那個WeatherForecast的預設項目模 ...
  • 1、環境搭建 1.1 依賴 <!-- nacos註冊中心 註解 @EnableDiscoveryClient --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba- ...
  • ULID:Universally Unique Lexicographically Sortable Identifier(通用唯一詞典分類標識符) UUID:Universally Unique Identifier(通用唯一標識符) 為什麼不選擇UUID UUID 目前有 5 個版本: 版本1: ...
  • 虛基類/抽象類 抽象類:有純虛函數的類 虛繼承 通過修飾繼承方式, 如代碼2是虛繼承,被虛繼承的類稱為虛基類 虛繼承派生類的記憶體佈局方式 先是vbptr => 派生類的數據 =>基類的數據 , 對比代碼1和代碼2,發現原本基類數據在前面,派生類數據在後面,但是在虛繼承的時候 基類數據方式放到了後面, ...
  • 下麵給出 Kafka 一些重要概念,讓大家對 Kafka 有個整體的認識和感知,後面還會詳細的解析每一個概念的作用以及更深入的原理 • Producer:消息生產者,向 Kafka Broker 發消息的客戶端。 • Consumer:消息消費者,從 Kafka Broker 取消息的客戶端。 • ...
  • 前面介紹了對稱加密演算法,本文將介紹密碼學中另一類重要應用:消息摘要(Digest),什麼是消息摘要?簡單的定義是:對一份數據,進行一個單向的Hash函數,生成一個固定長度的Hash值,這個值就是這份數據的摘要,也稱為指紋。 ...
  • 弟弟最近要考試,臨時抱佛腳在網上找了一堆學習資料複習,這不剛就來找我了,說PDF上有水印,影響閱讀效果,到時候考不好就怪資料不行,氣的我差點當場想把他揍一頓! 算了,弟弟長大了,看在打不過他的份上,就不打他了~ 稍加思索,我想起了Python不是可以去水印?說搞就搞! 去除水印原理 去除方法: 用 ...
  • 作者:陳昌浩 1 導讀 if…else…在代碼中經常使用,聽說可以通過Java 8的Function介面來消滅if…else…!Function介面是什麼?如果通過Function介面介面消滅if…else…呢?讓我們一起來探索一下吧。 2 Function介面 Function介面就是一個有且僅有 ...