表格檢視器

瀏覽範例

.NET 多平臺應用程式 UI (.NET MAUI) TableView 顯示一個可捲動的表格,分為不同的區段。 TableView 通常用於顯示每一行有不同樣式的專案,例如呈現設定表格。

這很重要

TableView 已被取代。 相反地,應該使用CollectionView

從 TableView 移轉至 CollectionView

TableView 在 .NET 10 中已被取代。 在大部分情境中,您應該遷移至CollectionView,它使用ItemTemplate來定義項目外觀,而不是依賴儲存格。

  • TextCell/ImageCell/ViewCell → 為您的項目類型定義 DataTemplate
  • SwitchCell/EntryCell → 在項目範本內撰寫這些控制項
  • 分組→使用IsGrouped="true"GroupHeaderTemplate / GroupFooterTemplate

之前(帶有 TextCell 的 TableView):

<TableView Intent="Menu">
    <TableRoot>
        <TableSection Title="Chapters">
            <TextCell Text="1. Introduction" Detail="Overview" />
            <TextCell Text="2. Layouts" Detail="Grids, stacks" />
        </TableSection>
    </TableRoot>
 </TableView>

之後(CollectionView 與 DataTemplate):

<CollectionView ItemsSource="{Binding Chapters}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid ColumnDefinitions="*,Auto" Padding="12,8">
                <VerticalStackLayout>
                    <Label Text="{Binding Title}" FontAttributes="Bold" />
                    <Label Text="{Binding Detail}" FontSize="12" TextColor="Gray" />
                </VerticalStackLayout>
                <Image Grid.Column="1" Source="chevron.png" VerticalOptions="Center" />
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

之前(帶有 SwitchCell 的 TableView):

<TableView Intent="Settings">
    <TableRoot>
        <TableSection>
            <SwitchCell Text="Airplane Mode" On="False" />
        </TableSection>
    </TableRoot>
</TableView>

之後 (具有組合控制項的 CollectionView):

<CollectionView ItemsSource="{Binding Settings}">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="local:SettingItem">
            <Grid ColumnDefinitions="*,Auto" Padding="12,8">
                <Label Text="{Binding Name}" VerticalOptions="Center" />
                <Switch Grid.Column="1"
                        IsToggled="{Binding IsOn, Mode=TwoWay}" />
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

指引如何建立清單,請參閱:

TableView管理數據表的外觀時,數據表中每個項目的外觀是由Cell定義的。 .NET MAUI 包含五種用來顯示不同數據組合的數據格類型,您也可以定義顯示任何您想要內容的自定義單元格。

TableView 定義了以下屬性:

  • Intent 類型的 TableIntent 定義了 iOS 上數據表的用途。
  • HasUnevenRows 類型為 bool,表示表格中的項目是否可以有不同高度的行。 此屬性的預設值為 false
  • Root 型的 TableRoot,定義了 TableView 的子元素。
  • RowHeight,類型為 int,當 HasUnevenRowsfalse 時,用於決定每一列的高度。

HasUnevenRowsRowHeight 屬性由 BindableProperty 物件所支援的,這表示它們可以是資料繫結的目標,並設定樣式。

屬性的Intent值有助於在 iOS 上定義TableView的外觀。 此屬性應設定為一個列舉的值 TableIntent,其定義了以下成員:

  • Menu,用於呈現可選擇的功能表。
  • Settings,用於呈現設定表。
  • Form,用於展示資料輸入表單。
  • Data,用於呈現資料。

注意

TableView 未設計支援繫結至一組項目。

建立 TableView

若要建立表格,請建立TableView物件,並將其Intent屬性設定為TableIntent成員。 TableView 的子項必須是 TableRoot 物件,此物件作為一個或多個 TableSection 物件的父項。 每個 TableSection 都包含一個可選的標題,其顏色也可以設定,以及一個或多個 Cell 物件。

下列範例示範如何建立 TableView:

<TableView Intent="Menu">
    <TableRoot>
        <TableSection Title="Chapters">
            <TextCell Text="1. Introduction to .NET MAUI"
                      Detail="Learn about .NET MAUI and what it provides." />
            <TextCell Text="2. Anatomy of an app"
                      Detail="Learn about the visual elements in .NET MAUI" />
            <TextCell Text="3. Text"
                      Detail="Learn about the .NET MAUI controls that display text." />
            <TextCell Text="4. Dealing with sizes"
                      Detail="Learn how to size .NET MAUI controls on screen." />
            <TextCell Text="5. XAML vs code"
                      Detail="Learn more about creating your UI in XAML." />
        </TableSection>
    </TableRoot>
</TableView>

在這個範例中,TableView 使用 TextCell 物件來定義選單:

Screenshot of TableView displaying a menu.TableView 顯示功能表的螢幕快照。

注意

只要Command屬性設為有效的ICommand實作,每個TextCell在點擊時都可以執行命令。

定義儲存格外觀

中的每個 TableView 項目都是由 Cell 物件定義,而 Cell 所使用的型別會定義儲存格的數據外觀。 .NET MAUI 包含下列內建單元格:

  • TextCell,它將主要和次要文字分別顯示在不同的行上。
  • ImageCell,它會在不同行上顯示包含主要和次要文字的影像。
  • SwitchCell,其中顯示文字和可開啟或關閉的切換開關。
  • EntryCell,顯示可編輯的標籤和文字。
  • ViewCell,這是一個自定義儲存格,其外觀是由 View 定義的。 當您想要完整地定義 TableView 中每個項目的外觀時,應該使用這個儲存格類型。

文字儲存格

TextCell上分別顯示主要文字和次要文字。 TextCell 定義下列屬性:

  • Text,其類型為string,定義了要顯示的主要文字。
  • TextColor 型別 Color 表示主要文字的色彩。
  • Detail,型別為 string,定義要顯示的次要文字。
  • DetailColor,類型為Color,表示次要文字的顏色。
  • ICommand類型的Command定義點選單元格時所執行的命令。
  • CommandParameter,類型為 object,代表傳遞至命令的參數。

這些屬性是由 BindableProperty 物件所支援,這表示這些屬性可以是資料綁定的目標,並且可以設定樣式。

下列範例示範如何使用 TextCell 來定義 TableView 中項目的外觀:

<TableView Intent="Menu">
    <TableRoot>
        <TableSection Title="Chapters">
            <TextCell Text="1. Introduction to .NET MAUI"
                      Detail="Learn about .NET MAUI and what it provides." />
            <TextCell Text="2. Anatomy of an app"
                      Detail="Learn about the visual elements in .NET MAUI" />
            <TextCell Text="3. Text"
                      Detail="Learn about the .NET MAUI controls that display text." />
            <TextCell Text="4. Dealing with sizes"
                      Detail="Learn how to size .NET MAUI controls on screen." />
            <TextCell Text="5. XAML vs code"
                      Detail="Learn more about creating your UI in XAML." />
        </TableSection>
    </TableRoot>
</TableView>

下列螢幕快照顯示結果儲存格的外觀:

Screenshot of TableView displaying a menu.TableView 顯示功能表的螢幕快照。

圖片儲存格

ImageCell 顯示包含主要和次要文字的影像,這些文字分別位於不同的行上。 ImageCell 繼承自 TextCell 的屬性,並定義 ImageSource 型屬性,以指定要顯示在儲存格中的影像。 這個屬性由BindableProperty物件支援,這代表它可以作為資料繫結的目標,並且可以被設置樣式。

下列範例示範如何使用ImageCell來定義TableView中的項目外觀:

<TableView Intent="Menu">
    <TableRoot>
        <TableSection Title="Learn how to use your XBox">
            <ImageCell Text="1. Introduction"
                       Detail="Learn about your XBox and its capabilities."
                       ImageSource="xbox.png" />
            <ImageCell Text="2. Turn it on"
                       Detail="Learn how to turn on your XBox."
                       ImageSource="xbox.png" />
            <ImageCell Text="3. Connect your controller"
                       Detail="Learn how to connect your wireless controller."
                       ImageSource="xbox.png" />
            <ImageCell Text="4. Launch a game"
                       Detail="Learn how to launch a game."
                       ImageSource="xbox.png" />
        </TableSection>
    </TableRoot>
</TableView>

下列螢幕快照顯示產生的儲存格外觀:

Screenshot of TableView where each item is an ImageCell.TableView 的螢幕快照,其中每個專案都是 ImageCell。

切換儲存格

會顯示文字和一個可以開啟或關閉的切換開關。 SwitchCell 定義了以下屬性:

  • Text, 類型為string, 定義了要顯示在開關旁的文字。
  • Onbool表示開關是開啟還是關閉。
  • OnColorColor類型,表示開位置時的開關顏色。

這些屬性是由 BindableProperty 物件所支援,這表示這些屬性可以是資料綁定的目標,並且可以設定樣式。

SwitchCell 也定義當開關變更狀態時所引發的事件。 伴隨ToggledEventArgs此事件的物件定義了Value屬性,該屬性指出開關是開啟還是關閉。

下列範例顯示使用 TextCell 來定義 TableView 項目外觀:

<TableView Intent="Settings">
    <TableRoot>
        <TableSection>
            <SwitchCell Text="Airplane Mode"
                        On="False" />
            <SwitchCell Text="Notifications"
                        On="True" />
        </TableSection>
    </TableRoot>
</TableView>

下列螢幕快照顯示儲存格的最終外觀:

TableView 的螢幕截圖,其中每個項目都是 SwitchCell。

輸入儲存格

EntryCell 是一個可以顯示可編輯標籤和文字資料的控件。 EntryCell 定義了以下屬性:

  • HorizontalTextAlignmentTextAlignment 表示文字的水平對齊方式。
  • Keyboard類型Keyboard決定輸入文字時要顯示的鍵盤。
  • 作為類型的,用於顯示在可編輯文字左邊的文字。
  • LabelColor 型別 Color,定義了標籤文字的顏色。
  • Placeholder,類型為string,表示在Text屬性為空時所顯示的文字。
  • Text,類型string,定義可編輯的文字。
  • VerticalTextAlignment,屬於TextAlignment型別,表示文字的垂直對齊方式。

這些屬性是由 BindableProperty 物件所支援,這表示這些屬性可以是資料綁定的目標,並且可以設定樣式。

EntryCell 也會定義一個在使用者按下回車鍵時引發的事件 Completed,以表示編輯完成。

下列範例示範如何使用 EntryCell 來定義TableView中項目的外觀:

<TableView Intent="Settings">
    <TableRoot>
        <TableSection>
            <EntryCell Label="Login"
                       Placeholder="username" />
            <EntryCell Label="Password"
                       Placeholder="password" />
        </TableSection>
    </TableRoot>
</TableView>

下列螢幕快照顯示產生的儲存格外觀:

Screenshot of TableView where each item is an EntryCell.TableView 的螢幕快照,其中每個項目都是 EntryCell。

檢視儲存格

ViewCell 是一個自定義儲存格,其外觀是由 View 定義的。 ViewCell 定義一個View屬性,其類型為View,用於定義代表單元格內容的檢視。 這個屬性由BindableProperty物件支援,這代表它可以作為資料繫結的目標,並且可以被設置樣式。

注意

View 屬性是 ViewCell 類別的內容屬性,因此不需要從 XAML 中明確設定。

下面的範例顯示如何使用 ViewCell 來定義 TableView 中項目的外觀:

<TableView Intent="Settings">
    <TableRoot>
        <TableSection Title="Silent">
            <ViewCell>
                <Grid RowDefinitions="Auto,Auto"
                      ColumnDefinitions="0.5*,0.5*">
                    <Label Text="Vibrate"
                           Margin="10,10,0,0"/>
                    <Switch Grid.Column="1"
                            HorizontalOptions="End" />
                    <Slider Grid.Row="1"
                            Grid.ColumnSpan="2"
                            Margin="10"
                            Minimum="0"
                            Maximum="10"
                            Value="3" />
                </Grid>
            </ViewCell>
        </TableSection>
    </TableRoot>
</TableView>

ViewCell 內,佈局可以由任何 .NET MAUI 佈局管理。 下列螢幕快照顯示產生的儲存格外觀:

TableView 的截圖,其中項目是 ViewCell。

調整項目大小

根據預設,TableView 中相同類型的所有儲存格的高度都是一樣的。 不過,您可以使用HasUnevenRowsRowHeight屬性來變更此行為。 預設情況下,HasUnevenRows 屬性是 false

屬性 RowHeight 可以設定為 int,表示 TableView 中每個項目的高度,前提是 HasUnevenRowsfalse。 當HasUnevenRows設為true時,TableView中的每個專案可以有不同的高度。 每個專案的高度會衍生自每個儲存格的內容,因此每個專案的大小都會調整為其內容。

在運行時間,只要HasUnevenRows屬性true,即可透過程式設計調整個別儲存格的大小,這是透過變更儲存格內元素的配置相關屬性來實現的。 下列範例會在點選儲存格時變更儲存格的高度:

void OnViewCellTapped(object sender, EventArgs e)
{
    label.IsVisible = !label.IsVisible;
    viewCell.ForceUpdateSize();
}

在此範例中,當單元格被點選時,將執行 OnViewCellTapped 事件處理程式。 事件處理程式會更新Label物件的可見性,而Cell.ForceUpdateSize方法會更新儲存格的大小。 如果 Label 已經顯示,儲存格的高度將會增加。 如果Label被設為不可見,則單元格的高度將會減少。

警告

過度使用動態項目尺寸調整可能會導致 TableView 性能下降。

從右至左的版面配置

TableView 可以透過將其 FlowDirection 屬性設定為 RightToLeft,以從右至左的流程方向配置其內容。 不過,FlowDirection屬性應該理想地設定在頁面或根版面配置上,這會使頁面內的所有元素或根版面配置能夠對流程方向作出反應:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TableViewDemos.RightToLeftTablePage"
             Title="Right to left TableView"
             FlowDirection="RightToLeft">
    <TableView Intent="Settings">
        ...
    </TableView>
</ContentPage>

具有父代的項目預設值 FlowDirectionMatchParent。 因此,TableView 繼承了 ContentPageFlowDirection 屬性值。