Megosztás a következőn keresztül:


Húzza le a frissítéshez

Az "húzd le a frissítésért" funkció lehetővé teszi, hogy a felhasználók érintéssel lehúzzanak egy adatlistát, hogy további adatokat töltsenek be. A lekéréses frissítést széles körben használják érintőképernyős eszközökön. Az itt látható API-k használatával lekéréses frissítést valósíthat meg az alkalmazásban.

lehúzás a frissítéshez gif

Ez a megfelelő vezérlő?

Akkor használja a lekéréses frissítést, ha olyan adatlistával vagy adatrácskal rendelkezik, amelyet a felhasználó rendszeresen frissíteni szeretne, és az alkalmazás valószínűleg érintéses eszközökön fog futni.

A RefreshVisualizer használatával konzisztens frissítési élményt is létrehozhat, amelyet más módokon hív meg, például egy frissítési gombbal.

Frissítési vezérlők

A lekéréses frissítést két vezérlő engedélyezi.

  • RefreshContainer – egy ContentControl, amely felhasználói interakciót biztosít a lehúzással történő frissítéshez. Kezeli az érintéses interakciókat, és kezeli a belső frissítési vizualizáció állapotát.
  • RefreshVisualizer – a következő szakaszban ismertetett frissítési vizualizációt foglalja magában.

A fő vezérlő a RefreshContainer, amelyet burkolóként helyez el a tartalom köré, amelyet a felhasználó lehúz a frissítéshez. A RefreshContainer csak érintéssel működik, ezért azt javasoljuk, hogy az érintéses kezelőfelülettel nem rendelkező felhasználók számára is legyen elérhető frissítési gomb. A frissítés gombot az alkalmazás megfelelő helyén helyezheti el egy parancssávon vagy a frissíteni kívánt surface közelében.

Vizualizáció frissítése

Az alapértelmezett frissítési vizualizáció egy körkörös folyamatábra, amely a frissítés bekövetkezésének és a frissítés indítását követő állapotának kommunikációjára szolgál. A frissítési vizualizációnak 5 állapota van.

A lista frissítésének indításához a felhasználónak le kell húznia egy bizonyos távolságot, amit küszöbértéknek nevezünk . A vizualizáló állapotát a húzó állapot határozza meg, aminek köze van ehhez a küszöbértékhez. A lehetséges értékeket a RefreshVisualizerState enumerálás tartalmazza.

Idle

A vizualizáció alapértelmezett állapota Tétlen. A felhasználó érintéssel nem kommunikál a RefreshContainerrel, és nincs folyamatban frissítés.

Vizuálisan nincs bizonyíték a frissítési vizualizációra.

Kapcsolatba lépni

Amikor a felhasználó a PullDirection tulajdonság által megadott irányba húzza le a listát, és a küszöbérték elérése előtt a vizualizáló Interacting állapotban van.

  • Ha a felhasználó ebben az állapotban felengedi a vezérlőt, a vezérlő visszaáll Tétlen.

    lekéréses frissítés előtti küszöbérték-

    Vizuálisan az ikon le van tiltva (60% átlátszóság). Emellett az ikon a görgetési művelettel egy teljes elforgatást is megpörget.

  • Ha a felhasználó meghúzza a listát a küszöbértéken túl, a vizualizáló eszköz átvált Interakció állapotbólFüggőben lévő állapotba.

    lehúzással frissítés küszöbértéke

    Az ikon vizuálisan 100% átlátszatlanságra és 150% méretű impulzusra vált, majd visszaáll 100% méretre az áttűnés során.

Függőben lévő

Amikor a felhasználó meghúzta a listát a küszöbértéken túl, a vizualizáló Függőben állapotban van.

  • Ha a felhasználó visszahúzza a listát a küszöbérték fölé anélkül, hogy elengedné, a rendszer visszakerül az Interakció állapotba.
  • Ha a felhasználó kiadja a listát, a rendszer frissítési kérelmet kezdeményez, és áttér a Frissítés állapotra.

lehúzással frissítés utáni küszöbérték

Az ikon vizuálisan 100% méretben és átlátszóságban is. Ebben az állapotban az ikon továbbra is lefelé mozog a görgetési művelettel, de már nem pörög.

Frissítő

Amikor a felhasználó elengedi a vizualizátort a küszöbérték fölött, Frissítés állapotba kerül.

Amikor belépnek ebbe az állapotba, a RefreshRequested esemény generálódik. Ez a jel az alkalmazás tartalomfrissítésének elindításához. Az esemény args (RefreshRequestedEventArgs) tartalmaz egy halasztott objektumot, amelyet az eseménykezelőben kell kezelnie. Ezt követően a halasztást befejezettként kell megjelölnie, amikor a frissítést végrehajtó kód befejeződött.

Amikor a frissítés befejeződött, a vizualizáció visszatér a Tétlen állapotba.

Az ikon vizuálisan visszahelyeződik a küszöbérték helyére, és a frissítés időtartama alatt pörög. Ez a pörgetés a frissítés előrehaladásának megjelenítésére szolgál, és a bejövő tartalom animációja váltja fel.

Kukucskálás

Ha a felhasználó olyan kezdőpozícióból húz a frissítés irányába, ahol a frissítés nem engedélyezett, a vizualizáló belép a Betekintő állapotba. Ez általában akkor fordul elő, ha a ScrollViewer nem a 0. pozícióban van, amikor a felhasználó elkezd lekérni.

  • Ha a felhasználó ebben az állapotban felengedi a vezérlőt, a vezérlő visszaáll Tétlen.

Húzás irány

A felhasználó alapértelmezés szerint felülről lefelé lekéri a listát a frissítés indításához. Ha eltérő tájolású lista vagy rácsos elrendezés van, a frissítési konténer húzási irányát úgy kell megváltoztatni, hogy az egyezzen.

A PullDirection tulajdonság a következő RefreshPullDirection értékek egyikét veszi fel: BottomToTop, TopToBottom, RightToLeftvagy LeftToRight.

A lekérés irányának módosításakor a vizualizáció folyamatjelzőjének kezdőpozíciója automatikusan elfordul, hogy a nyíl a lekérés irányának megfelelő pozícióba induljon. Szükség esetén módosíthatja a RefreshVisualizer.Orientation tulajdonságot az automatikus viselkedés felülbírálásához. A legtöbb esetben azt javasoljuk, hogy hagyja meg a Automatikusalapértelmezett értékét.

Lekéréses frissítés implementálása

WinUI 3 Katalógus ikon A WinUI 3 Katalógus alkalmazás interaktív példákat tartalmaz a WinUI vezérlőire és funkcióira. Kérje le az alkalmazást a Microsoft Áruházból vagy keresse meg a forráskódot a GitHub webhelyen.

A lekéréses frissítési funkciók listához való hozzáadásához mindössze néhány lépésre van szükség.

  1. Csomagolja be a listát egy RefreshContainer vezérlőelembe.
  2. A tartalom frissítéséhez kezelje a RefreshRequested eseményt.
  3. Igény szerint kezdeményezheti a frissítést RequestRefresh meghívásával (például egy gombra kattintva).

Megjegyzés:

A RefreshVisualizert önállóan is létrehozhatja. Javasoljuk azonban, hogy a tartalmat egy RefreshContainerbe csomagolja, és használja a RefreshContainer.Visualizer tulajdonság által biztosított RefreshVisualizert, még érintés nélküli forgatókönyvek esetén is. Ebben a cikkben feltételezzük, hogy a vizualizáció mindig a frissítési tárolóból származik.

Emellett a frissítési tároló RequestRefresh és RefreshRequested tagjait is használhatja a kényelem érdekében. refreshContainer.RequestRefresh() egyenértékű refreshContainer.Visualizer.RequestRefresh()-gyel. Mindkettő kiváltja a RefreshContainer.RefreshRequested eseményt és a RefreshVisualizer.RefreshRequested eseményeket is.

Frissítés kérése

A frissítési tároló kezeli az érintéses interakciókat, hogy a felhasználók érintéssel frissíthessenek tartalmat. Azt javasoljuk, hogy adjon meg egyéb lehetőségeket az érintés nélküli felületekhez, például frissítési gombot vagy hangvezérlést.

Frissítés indításához hívja meg a RequestRefresh metódust.

// See the Examples section for the full code.
private void RefreshButtonClick(object sender, RoutedEventArgs e)
{
    RefreshContainer.RequestRefresh();
}

Amikor a RequestRefresh hívást végrehajtják, a vizualizáló állapota közvetlenül Tétlen állapotból Frissítésiállapotba vált.

Frissítési kérelem kezelése

Ha szükség esetén friss tartalmat szeretne kapni, kezelje a RefreshRequested eseményt. Az eseménykezelőben az alkalmazáshoz tartozó kódra lesz szüksége a friss tartalom beszerzéséhez.

Az esemény args (RefreshRequestedEventArgs) tartalmaz egy Deferral objektumot. Lekérheti a halasztást az eseménykezelőben. Ezután jelölje meg a halasztást befejezettként, amikor a frissítést végrehajtó kód befejeződött.

// See the Examples section for the full code.
private async void RefreshContainer_RefreshRequested(RefreshContainer sender, RefreshRequestedEventArgs args)
{
    // Respond to a request by performing a refresh and using the deferral object.
    using (var RefreshCompletionDeferral = args.GetDeferral())
    {
        // Do some async operation to refresh the content

         await FetchAndInsertItemsAsync(3);

        // The 'using' statement ensures the deferral is marked as complete.
        // Otherwise, you'd call
        // RefreshCompletionDeferral.Complete();
        // RefreshCompletionDeferral.Dispose();
    }
}

Állapotváltozások megválaszolása

Szükség esetén reagálhat a vizualizáció állapotának változásaira. Ha például több frissítési kérést szeretne megakadályozni, letilthat egy frissítési gombot, amíg a vizualizáció frissül.

// See the Examples section for the full code.
private void Visualizer_RefreshStateChanged(RefreshVisualizer sender, RefreshStateChangedEventArgs args)
{
    // Respond to visualizer state changes.
    // Disable the refresh button if the visualizer is refreshing.
    if (args.NewState == RefreshVisualizerState.Refreshing)
    {
        RefreshButton.IsEnabled = false;
    }
    else
    {
        RefreshButton.IsEnabled = true;
    }
}

ScrollViewer használata RefreshContainerben

Megjegyzés:

A RefreshContainer tartalmának görgethető vezérlőnek kell lennie, például ScrollViewernek, GridView-nak, ListView-nak stb. Ha a Tartalmat egy olyan vezérlőelemre állítja, mint a Grid, az nem definiált viselkedést eredményez.

Ez a példa bemutatja, hogyan használható a lekéréses frissítés görgetőmegjelenítővel.

<RefreshContainer>
    <ScrollViewer VerticalScrollMode="Enabled"
                  VerticalScrollBarVisibility="Auto"
                  HorizontalScrollBarVisibility="Auto">
 
        <!-- Scrollviewer content -->

    </ScrollViewer>
</RefreshContainer>

Lekéréses frissítés hozzáadása ListView-hoz

Ez a példa bemutatja, hogyan használható a lekéréses frissítés listanézettel.

<StackPanel Margin="0,40" Width="280">
    <CommandBar OverflowButtonVisibility="Collapsed">
        <AppBarButton x:Name="RefreshButton" Click="RefreshButtonClick"
                      Icon="Refresh" Label="Refresh"/>
        <CommandBar.Content>
            <TextBlock Text="List of items" 
                       Style="{StaticResource TitleTextBlockStyle}"
                       Margin="12,8"/>
        </CommandBar.Content>
    </CommandBar>

    <RefreshContainer x:Name="RefreshContainer">
        <ListView x:Name="ListView1" Height="400">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:ListItemData">
                    <Grid Height="80">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <TextBlock Text="{x:Bind Path=Header}"
                                   Style="{StaticResource SubtitleTextBlockStyle}"
                                   Grid.Row="0"/>
                        <TextBlock Text="{x:Bind Path=Date}"
                                   Style="{StaticResource CaptionTextBlockStyle}"
                                   Grid.Row="1"/>
                        <TextBlock Text="{x:Bind Path=Body}"
                                   Style="{StaticResource BodyTextBlockStyle}"
                                   Grid.Row="2"
                                   Margin="0,4,0,0" />
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </RefreshContainer>
</StackPanel>
public sealed partial class MainPage : Page
{
    public ObservableCollection<ListItemData> Items { get; set; } 
        = new ObservableCollection<ListItemData>();

    public MainPage()
    {
        this.InitializeComponent();

        Loaded += MainPage_Loaded;
        ListView1.ItemsSource = Items;
    }

    private async void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Loaded -= MainPage_Loaded;
        RefreshContainer.RefreshRequested += RefreshContainer_RefreshRequested;
        RefreshContainer.Visualizer.RefreshStateChanged += Visualizer_RefreshStateChanged;

        // Add some initial content to the list.
        await FetchAndInsertItemsAsync(2);
    }

    private void RefreshButtonClick(object sender, RoutedEventArgs e)
    {
        RefreshContainer.RequestRefresh();
    }

    private async void RefreshContainer_RefreshRequested(RefreshContainer sender, RefreshRequestedEventArgs args)
    {
        // Respond to a request by performing a refresh and using the deferral object.
        using (var RefreshCompletionDeferral = args.GetDeferral())
        {
            // Do some async operation to refresh the content

            await FetchAndInsertItemsAsync(3);

            // The 'using' statement ensures the deferral is marked as complete.
            // Otherwise, you'd call
            // RefreshCompletionDeferral.Complete();
            // RefreshCompletionDeferral.Dispose();
        }
    }

    private void Visualizer_RefreshStateChanged(RefreshVisualizer sender, RefreshStateChangedEventArgs args)
    {
        // Respond to visualizer state changes.
        // Disable the refresh button if the visualizer is refreshing.
        if (args.NewState == RefreshVisualizerState.Refreshing)
        {
            RefreshButton.IsEnabled = false;
        }
        else
        {
            RefreshButton.IsEnabled = true;
        }
    }

    // App specific code to get fresh data.
    private async Task FetchAndInsertItemsAsync(int updateCount)
    {
        for (int i = 0; i < updateCount; ++i)
        {
            // Simulate delay while we go fetch new items.
            await Task.Delay(1000);
            Items.Insert(0, GetNextItem());
        }
    }

    private ListItemData GetNextItem()
    {
        return new ListItemData()
        {
            Header = "Header " + DateTime.Now.Second.ToString(),
            Date = DateTime.Now.ToLongDateString(),
            Body = DateTime.Now.ToLongTimeString()
        };
    }
}

public class ListItemData
{
    public string Header { get; set; }
    public string Date { get; set; }
    public string Body { get; set; }
}