【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
  • 1.1 關於C# C#只是一種簡單安全的新型面向對象語言,繼承了C的語法風格和C++的面向對象特性,不再提供對指針類型的支持(因此程式不可隨便訪問記憶體地址空間)、不再支持多重繼承; C#的誕生意義是生成面向.NET Framework環境的代碼,身為編程語言的一種,它作為開發工具而存在,本身並不是. ...
  • 往一張產品圖片上,加兩個小標簽,Demo實現最好的效果 素材例圖與最終效果如下: 具體實現的代碼如下: 添加引用: using System.Drawing; using System.Drawing.Drawing2D; 註意:如果添加命名空間沒效果,加一下Nuget包 System.Drawin ...
  • 前置要求:有百度賬號,實名認證以及開發者認證,創建應用並獲取到關鍵憑證:Appid、Appkey、Secretkeyk和Signkey 平臺上入門十分清楚,直接對著逐步操作即可,個人開發者審核也很快 百度網盤開放平臺地址如下:https://pan.baidu.com/union/doc/nksg0 ...
  • 使用方法 安裝 Maven <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join</artifactId> <version>1.2.4</version> </dependency> G ...
  • 數字常量 int: 一般的整數, long: 長整型,2.x版本需在數字後加 “L” 或 “l” ,表示長整型 如 100000000L; python3.x 版本後不分長整型,統一為int,不可加 “L” 或 “l” float: 浮點數,1.0 也為浮點數,float 可強制轉換為 int,取整 ...
  • if __name__ == "__main__" 也就是說執行當前文件,不調用模塊的時候__name__=__main__ 調用模塊的時候,測試如下: 1、新建 test01.py 文件測試代碼如下 print("這條消息來自test01") def func(): print('hello, w ...
  • 一.scoket基本介紹 1.scoket簡介(以下是來自chatgpt回答) 1)Socket(套接字)是電腦網路中用於描述主機之間通信的一種機制。它定義了一種標準的介面, 使得應用程式可以利用網路傳輸層提供的服務(如TCP或UDP)進行通信。 2)Socket的作用是在網路應用程式之間提供數據 ...
  • 一、函數的定義 可以分為以下兩種: 1、函數聲明和函數定義分離 這種方法將函數聲明和函數定義分開,通常在頭文件中先聲明函數原型,然後在源文件中實現函數定義。 例如,頭文件 example.h 中聲明瞭一個函數 add: #ifndef EXAMPLE_H #define EXAMPLE_H int ...
  • 一 回顧trait使用 https://blog.csdn.net/bushuwei/article/details/103514174發現之前本人說明很模糊,自己居然不知道為什麼其實這裡的$c,就是class B再次回顧邏輯 二 分析 self和static區別說的沒毛病 Trait基類use t ...
  • 一、延遲計算 RDD 代表的是分散式數據形態,因此,RDD 到 RDD 之間的轉換,本質上是數據形態上的轉換(Transformations) 在 RDD 的編程模型中,一共有兩種運算元,Transformations 類運算元和 Actions 類運算元。開發者需要使用 Transformations ...