【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、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...