Udostępnij przez


Widok elementów

Widok elementów służy do wyświetlania kolekcji elementów danych, takich jak zdjęcia w albumie lub elementach w katalogu produktów.

Widok elementów jest podobny do kontrolek widoku listy i widoku siatki i można go używać w większości przypadków, w których można użyć tych kontrolek. Jedną z zalet widoku elementów jest możliwość przełączania układu na bieżąco przy zachowaniu zaznaczenia elementu.

Kontrolka widoku elementów jest kompilowana przy użyciu składników ItemsRepeater, ScrollView, ItemContainer i ItemCollectionTransitionProvider , dzięki czemu oferuje unikatową możliwość podłączania niestandardowych implementacji Layout lub ItemCollectionTransitionProvider . Wewnętrzna kontrolka ScrollView widoku elementu umożliwia przewijanie i powiększanie elementów. Oferuje również funkcje niedostępne w kontrolce ScrollViewer używanej przez widok listy i widok siatki, podobnie jak możliwość kontrolowania animacji podczas przewijania programowego.

Podobnie jak w przypadku kontrolek widoku listy i widoku siatki, widok elementów może używać interfejsu użytkownika i wirtualizacji danych; uchwyt klawiatury, myszy, pióra i wejścia dotykowego; ma wbudowaną obsługę ułatwień dostępu.

Czy jest to właściwa kontrola?

Użyj widoku elementów, aby:

  • Wyświetl kolekcję, w której wszystkie elementy powinny mieć takie samo zachowanie wizualne i interakcji.
  • Wyświetl kolekcję zawartości z możliwością przełączania się między listą, siatką i niestandardowymi układami.
  • Uwzględnij różne przypadki użycia, w tym następujące typowe:
    • Interfejs użytkownika typu sklepu (tj. przeglądanie aplikacji, piosenek, produktów)
    • Interaktywne biblioteki zdjęć
    • Lista kontaktów

Tworzenie widoku elementów

Aplikacja Galeria WinUI 3 zawiera interaktywne przykłady większości kontrolek, funkcji i funkcji interfejsu WinUI 3. Pobierz aplikację ze Sklepu Microsoft lub pobierz kod źródłowy w witrynie GitHub

Element ItemsView może wyświetlać kolekcję elementów dowolnego typu. Aby wypełnić widok, ustaw właściwość ItemsSource na źródło danych.

Uwaga / Notatka

W przeciwieństwie do innych kontrolek kolekcji (które pochodzą z elementu ItemsControl), element ItemsView nie ma właściwości Items , do której można dodawać elementy danych bezpośrednio.

Ustawianie źródła elementów

Zazwyczaj używasz widoku elementów do wyświetlania danych ze źródła, takiego jak baza danych lub Internet. Aby wypełnić widok elementów ze źródła danych, należy ustawić jego właściwość ItemsSource na kolekcję elementów danych.

Ustawianie elementuŹródło w kodzie

W tym miejscu źródło elementów jest ustawiane w kodzie bezpośrednio na wystąpienie kolekcji.

 // Data source.
 List<String> itemsList = new List<string>();
 itemsList.Add("Item 1");
 itemsList.Add("Item 2");

 // Create a new ItemsView and set the data source.
 ItemsView itemsView1 = new ItemsView();
 itemsView1.ItemsSource = itemsList;

 // Add the ItemsView to a parent container in the visual tree.
 rootGrid.Children.Add(itemsView1);

Wiązanie elementówŹródło w języku XAML

Właściwość ItemsSource można również powiązać z kolekcją w języku XAML. Aby uzyskać więcej informacji, zobacz Powiązanie danych za pomocą języka XAML.

Ważne

W przypadku korzystania z rozszerzenia znaczników x:Bind w elemecie DataTemplate należy określić typ danych (x:DataType) w szablonie danych.

W tym miejscu źródło elementów jest powiązane z kolekcją niestandardowych obiektów danych (typu Photo).

<ItemsView ItemsSource="{x:Bind Photos}">

</ItemsView>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        Photos = new ObservableCollection<Photo>();
        PopulatePhotos();
    }

    public ObservableCollection<Photo> Photos
    {
        get; private set;
    }


    private void PopulatePhotos()
    {
        // Populate the Photos collection. 
    }
}

public class Photo
{
    public BitmapImage PhotoBitmapImage { get; set; }
    public string Title { get; set; }
    public int Likes { get; set; }
}

Określanie wyglądu elementów

Domyślnie element danych jest wyświetlany w widoku elementów jako reprezentacja ciągu obiektu danych, z którą jest powiązana. Zazwyczaj chcesz pokazać bardziej bogatą prezentację danych. Aby określić dokładnie sposób wyświetlania elementów w widoku elementów, należy utworzyć element DataTemplate. Język XAML w elemencie DataTemplate definiuje układ i wygląd kontrolek używanych do wyświetlania pojedynczego elementu. Kontrolki w układzie mogą być powiązane z właściwościami obiektu danych lub mieć zdefiniowaną zawartość statyczną w tekście. Element DataTemplate jest przypisywany do właściwości ItemTemplate kontrolki ItemsView.

Ważne

Element główny elementu elementu DataTemplate musi być elementem ItemContainer; w przeciwnym razie zgłaszany jest wyjątek. ItemContainer to niezależna kontrolka pierwotna używana przez element ItemsView do wyświetlania stanów zaznaczenia i innych wizualizacji pojedynczego elementu w kolekcji elementów.

W tym przykładzie element DataTemplate jest zdefiniowany w elemecie Page.ResourcesResourceDictionary. Zawiera kontrolkę Obraz w celu pokazania obrazu i nakładki zawierającej tytuł obrazu i liczbę polubień, które są odbierane.

 <Page.Resources>
     <DataTemplate x:Key="PhotoItemTemplate" x:DataType="local:Photo">
         <ItemContainer AutomationProperties.Name="{x:Bind Title}">
             <Grid>
                 <Image Source="{x:Bind PhotoBitmapImage, Mode=OneWay}" 
                        Stretch="UniformToFill" MinWidth="70"
                        HorizontalAlignment="Center" VerticalAlignment="Center"/>
                 <StackPanel Orientation="Vertical" Height="40" Opacity=".75"
                             VerticalAlignment="Bottom" Padding="5,1,5,1" 
                             Background="{ThemeResource SystemControlBackgroundBaseMediumBrush}">
                     <TextBlock Text="{x:Bind Title}" 
                                Foreground="{ThemeResource SystemControlForegroundAltHighBrush}"/>
                     <StackPanel Orientation="Horizontal">
                         <TextBlock Text="{x:Bind Likes}"
                                    Style="{ThemeResource CaptionTextBlockStyle}"
                                    Foreground="{ThemeResource SystemControlForegroundAltHighBrush}"/>
                         <TextBlock Text=" Likes"
                                    Style="{ThemeResource CaptionTextBlockStyle}"
                                    Foreground="{ThemeResource SystemControlForegroundAltHighBrush}"/>
                     </StackPanel>
                 </StackPanel>
             </Grid>
         </ItemContainer>
     </DataTemplate>
 </Page.Resources>

 <Grid x:Name="rootGrid">
     <ItemsView ItemsSource="{x:Bind Photos}" Width="480" Height="400" 
                ItemTemplate="{StaticResource PhotoItemTemplate}">
     </ItemsView>
 </Grid>

Oto jak wygląda układ elementu zdefiniowany przez szablon danych.

Zdjęcie rowerów z nakładką zawierającą tytuł obrazu i liczbę polubień otrzymanych.

Zmienianie układu elementów

Po dodaniu elementów do kontrolki ItemsView automatycznie opakowuje każdy element w elemencie ItemContainer , a następnie określa wszystkie kontenery elementów. Sposób, w jaki te kontenery elementów są rozmieszczone, zależy od właściwości Layout kontrolki.

Układ elementów można zmodyfikować, dostosowując właściwości bieżącego układu lub całkowicie zastąpić bieżący układ innym układem. Możesz użyć jednego z opisanych dalej układów lub utworzyć niestandardowy układ z klasy Layout .

StackLayout

Domyślnie element ItemsView używa elementu StackLayout, który tworzy pionową listę, pokazaną tutaj z domyślnymi ustawieniami właściwości i prostym szablonem obrazu.

Kolekcja zdjęć pokazanych na liście pionowej.

Ten kod XAML ustawia odstępy między elementami w elemencji StackLayout na 5 pikseli.

<ItemsView ItemsSource="{x:Bind Photos}" Width="480" Height="400" 
           ItemTemplate="{StaticResource PhotoItemTemplate}">
    <ItemsView.Layout>
        <StackLayout Spacing="5"/>
    </ItemsView.Layout>
</ItemsView>

StackLayout udostępnia właściwości do kontrolowania:

  • czy układ jest pionowy, czy poziomy (orientacja)
  • odstępy między elementami (odstępy)

Możesz użyć układu w połączeniu z elementem ItemTemplate, aby zapewnić kolekcji różne wyglądy dostosowane do Twoich potrzeb. Na przykład przykład z galerii WinUI zmienia element ItemTemplate używany w elemencie StackLayout w taki sposób.

Kolekcja małych zdjęć pokazanych na pionowej liście z kilkoma wierszami tekstu poniżej każdego zdjęcia.

LinedFlowLayout

Element LinedFlowLayout umieszcza elementy sekwencyjnie od lewej do prawej, a następnie od góry do dołu w układzie zawijania. Użyj tego układu, aby wyświetlić kolekcję elementów, w której elementy mają stałą wysokość, ale zmienną szerokość. Zalecamy używanie kolekcji opartych na obrazach. Ten układ zawiera również wbudowane animacje odtwarzane po dodaniu lub usunięciu elementów kolekcji oraz zmianie rozmiaru widoku.

Oto widok elementów przedstawiający kolekcję zdjęć w układzie przepływu liniowego.

<ItemsView Width="500" Height="400" HorizontalAlignment="Left"
           ItemTemplate="{StaticResource LinedFlowLayoutItemTemplate}">
    <ItemsView.Layout>
        <LinedFlowLayout ItemsStretch="Fill" 
                         LineHeight="160" 
                         LineSpacing="5"
                         MinItemSpacing="5"/>
    </ItemsView.Layout>
</ItemsView>

Kolekcja zdjęć pokazanych w układzie przepływu liniowego, w którym każdy element ma taką samą wysokość, ale szerokość różni się w zależności od oryginalnego rozmiaru proporcji zdjęcia.

LinedFlowLayout udostępnia właściwości do kontrolowania:

UniformGridLayout

Elementy UniformGridLayout są pozycje sekwencyjnie od lewej do prawej lub górnej do dołu (w zależności od orientacji) w układzie zawijania. Każdy element ma ten sam rozmiar.

Oto widok elementów przedstawiający kolekcję zdjęć w układzie jednolitej siatki.

<ItemsView ItemsSource="{x:Bind Photos}" Width="480" Height="400"
           ItemTemplate="{StaticResource PhotoItemTemplate}">
    <ItemsView.Layout>
        <UniformGridLayout MaximumRowsOrColumns="3" 
                           MinRowSpacing="5" 
                           MinColumnSpacing="5"/>
    </ItemsView.Layout>
</ItemsView>

Kolekcja zdjęć pokazanych w jednolitym układzie siatki, w którym każdy element ma taki sam rozmiar.

UniformGridLayout udostępnia właściwości do kontrolowania:

Wskazówka

Użyj interaktywnego pokazu w aplikacji Galeria WinUI 3 , aby zobaczyć efekt tych właściwości w czasie rzeczywistym.

Wybór elementu i interakcja

Możesz wybrać spośród różnych sposobów, aby umożliwić użytkownikom interakcję z widokiem elementów. Domyślnie użytkownicy mogą wybrać pojedynczy element. Możesz zmienić właściwość SelectionMode, aby włączyć wybór wielokrotny lub wyłączyć zaznaczenie. Można ustawić właściwość IsItemIn invokeEnabled , aby użytkownicy klikali element w celu wywołania akcji zamiast wybierania elementu.

W tej tabeli przedstawiono sposoby interakcji użytkownika z widokiem elementów oraz sposób reagowania na interakcję.

Aby włączyć tę interakcję: Użyj następujących ustawień: Obsłuż to zdarzenie: Użyj tej właściwości, aby pobrać wybrany element:
Brak interakcji SelectionMode="Brak"
IsItemInvokedEnabled="False"
N/A N/A
Pojedynczy wybór Tryb wyboru="Pojedynczy"
IsItemInvokedEnabled="False"
WybórZmieniono wybrany element
Wybór wielokrotny Tryb wyboru="Wiele"
IsItemInvokedEnabled="False"
WybórZmieniono Wybrane elementy
Wybór rozszerzony TrybWyboru="Rozszerzony"
IsItemInvokedEnabled="False"
WybórZmieniono Wybrane elementy
Kliknij TrybWybierania="None"
IsItemInvokedEnabled="True"
Element Wywoływany N/A

Uwaga / Notatka

Można włączyć właściwość IsItemInvokedEnabled, aby zgłosić zdarzenie ItemInvoked, podczas gdy właściwość SelectionMode jest również ustawiona na Single, Multiplelub Extended. Jeśli to zrobisz, najpierw zostanie zgłoszone zdarzenie ItemInvoked, a następnie zostanie zgłoszone zdarzenie SelectionChanged. W niektórych przypadkach (na przykład jeśli przejdziesz do innej strony w procedurze obsługi zdarzeń ItemInvoked), zdarzenie SelectionChanged nie zostanie zgłoszone i element nie zostanie wybrany.

Te właściwości można ustawić w języku XAML lub w kodzie, jak pokazano poniżej:

<ItemsView x:Name="myItemsView" SelectionMode="None" IsItemInvokedEnabled="True"/>
myItemsView.SelectionMode = ItemsViewSelectionMode.None;
myItemsView.IsItemInvokedEnabled = true;

Read-only

Właściwość SelectionMode można ustawić na ItemsViewSelectionMode.None , aby wyłączyć zaznaczenie elementu. Spowoduje to przełączenie kontrolki w tryb tylko do odczytu, dzięki czemu jest używana do wyświetlania danych, ale nie do interakcji z nią. Oznacza to, że wybór elementu jest wyłączony, ale sama kontrolka nie jest.

Uwaga / Notatka

Elementy mogą być nadal wybierane i niezaznaczone programowo, ale nie za pośrednictwem interakcji z użytkownikiem.

Pojedynczy wybór

W tej tabeli opisano interakcje klawiatury, myszy i dotyku, gdy właściwość SelectionMode jest ustawiona na Singlewartość .

Klucz modyfikujący Interakcja
Żaden
  • Użytkownicy mogą wybrać pojedynczy element przy użyciu paska spacji, kliknięć myszy lub naciśnięcia.
  • Ctrl
  • Użytkownicy mogą usunąć zaznaczenie pojedynczego elementu przy użyciu paska spacji, kliknięć myszy lub naciśnięcia.
  • Za pomocą strzałek użytkownicy mogą przenosić fokus niezależnie od zaznaczenia.
  • Gdy właściwość SelectionMode jest ustawiona na Single, możesz pobrać wybrany element danych z właściwości SelectedItem . Jeśli żaden element nie jest zaznaczony, element SelectedItem to null.

    Jeśli spróbujesz ustawić element, który nie znajduje się w kolekcji elementów jako SelectedItem, operacja zostanie zignorowana, a element SelectedItem to null.

    Domyślny wskaźnik wyboru dla Single zaznaczenia wygląda następująco.

    Obraz w widoku elementów z niebieskim obramowaniem wskazującym zaznaczenie obok niezaznaczonego obrazu bez obramowania.

    Wybór wielokrotny

    W tej tabeli opisano interakcje klawiatury, myszy i dotyku, gdy opcja SelectionMode jest ustawiona na Multiplewartość .

    Klucz modyfikujący Interakcja
    Żaden
  • Użytkownicy mogą wybierać wiele elementów przy użyciu paska spacji, kliknięć myszy lub naciśnięcia, aby wybrać element ukierunkowany.
  • Za pomocą strzałek użytkownicy mogą przenosić fokus niezależnie od ich wyboru.
  • Zmiana
  • Użytkownicy mogą wybrać wiele ciągłych elementów, klikając lub naciskając pierwszy element w zaznaczeniu, a następnie klikając lub naciskając ostatni element w zaznaczeniu.
  • Za pomocą strzałek użytkownicy mogą wybierać ciągłe elementy rozpoczynające się od elementu wybranego po wybraniu Shift.
  • Domyślny wskaźnik wyboru dla Multiple zaznaczenia wygląda następująco.

    Obraz w widoku elementów z niebieskim obramowaniem wokół niego i polem wyboru zaznaczonego w celu wskazania zaznaczenia obok niezaznaczonego obrazu bez obramowania i niezaznaczonego pola wyboru.

    Wybór rozszerzony

    W tej tabeli opisano interakcje klawiatury, myszy i dotyku, gdy opcja SelectionMode jest ustawiona na Extendedwartość .

    Klucz modyfikujący Interakcja
    Żaden
  • Zachowanie jest takie samo jak Single zaznaczenie.
  • Ctrl
  • Użytkownicy mogą wybierać wiele elementów przy użyciu paska spacji, kliknięć myszy lub naciśnięcia, aby wybrać element ukierunkowany.
  • Za pomocą strzałek użytkownicy mogą przenosić fokus niezależnie od zaznaczenia.
  • Zmiana
  • Użytkownicy mogą wybrać wiele ciągłych elementów, klikając lub naciskając pierwszy element w zaznaczeniu, a następnie klikając lub naciskając ostatni element w zaznaczeniu.
  • Za pomocą strzałek użytkownicy mogą wybierać ciągłe elementy rozpoczynające się od elementu wybranego po wybraniu Shift.
  • Gdy właściwość SelectionMode jest ustawiona na Multiple lub Extended, możesz pobrać wybrane elementy danych z właściwości SelectedItems .

    Właściwości SelectedItem i SelectedItems są synchronizowane. Jeśli na przykład ustawisz wartość SelectedItem na null, element SelectedItems jest pusty. W trybie wyboru wielokrotnego element SelectedItem zawiera element, który został wybrany jako pierwszy.

    Domyślny wskaźnik wyboru dla Extended zaznaczenia jest taki sam jak w przypadku Single zaznaczenia i wygląda następująco.

    Dwa obrazy w widoku elementów, każdy z niebieskim obramowaniem wokół niego, aby wskazać zaznaczenie.

    Programowe zarządzanie wyborem elementów

    Uwaga / Notatka

    Te metody wyboru ignorują właściwość SelectionMode i mają wpływ nawet wtedy, gdy element SelectionMode jest Single lub None.

    Czasami może być konieczne programowe manipulowanie wyborem elementu ItemsView. Możesz na przykład wyświetlić przycisk Wybierz wszystko, aby umożliwić użytkownikom wybranie wszystkich elementów na liście. W takim przypadku zwykle nie jest to bardzo wydajne, aby dodawać i usuwać elementy z kolekcji SelectedItems jeden po drugim. Wydajniejsze jest użycie metod Select, SelectAll, Deselect i InvertSelection w celu zmodyfikowania zaznaczenia niż używania właściwości SelectedItems.

    Wskazówka

    Możesz wybrać wszystkie elementy w kolekcji, wywołując metodę SelectAll. Brak odpowiedniej metody usuwania zaznaczenia wszystkich elementów. Można jednak usunąć zaznaczenie wszystkich elementów, wywołując metodę SelectAll, po której następuje natychmiast przez polecenie InvertSelection.

    Pobieranie przykładowego kodu