【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. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...