Xamarin.Forms Navigace v prostředí
Xamarin.Forms Prostředí zahrnuje navigační prostředí založené na identifikátoru URI, které používá trasy k navigaci na libovolnou stránku v aplikaci, aniž by bylo nutné dodržovat nastavenou navigační hierarchii. Kromě toho také poskytuje možnost přecházet zpět, aniž byste museli navštěvovat všechny stránky v navigačním zásobníku.
Třída Shell
definuje následující vlastnosti související s navigacemi:
BackButtonBehavior
, typuBackButtonBehavior
, připojená vlastnost, která definuje chování tlačítka Zpět.CurrentItem
, typuShellItem
, aktuálně vybraná položka.CurrentPage
, typuPage
, aktuálně prezentovaná stránka.CurrentState
, typuShellNavigationState
, aktuální navigační stavShell
.Current
, typuShell
, přetypovaný alias proApplication.Current.MainPage
.
Objekty BackButtonBehavior
a CurrentItem
CurrentState
vlastnosti jsou podporovány BindableProperty
objekty, což znamená, že tyto vlastnosti mohou být cílem datových vazeb.
Navigace se provádí vyvoláním GoToAsync
metody z Shell
třídy. Když se chystáte provést navigaci, Navigating
událost se aktivuje a Navigated
událost se aktivuje po dokončení navigace.
Poznámka:
Navigace se dá dál provádět mezi stránkami v aplikaci Prostředí pomocí navigační vlastnosti. Další informace naleznete v tématu Hierarchická navigace.
Trasy
Navigace se provádí v aplikaci Prostředí zadáním identifikátoru URI, na který chcete přejít. Identifikátory URI navigace můžou mít tři komponenty:
- Trasa, která definuje cestu k obsahu, který existuje jako součást hierarchie vizuálů prostředí.
- Stránka. Stránky, které v hierarchii vizuálů prostředí neexistují, je možné do navigačního zásobníku odeslat odkudkoliv v rámci aplikace Shell. Například stránka podrobností nebude definována v hierarchii vizuálů prostředí, ale můžete ji podle potřeby odeslat do navigačního zásobníku.
- Jeden nebo více parametrů dotazu. Parametry dotazu jsou parametry, které lze předat na cílovou stránku při navigaci.
Pokud navigační identifikátor URI obsahuje všechny tři komponenty, struktura je: //route/page?queryParameters.
Registrace tras
Trasy lze definovat pro FlyoutItem
objekty , , TabBar
Tab
a ShellContent
to prostřednictvím jejich Route
vlastností:
<Shell ...>
<FlyoutItem ...
Route="animals">
<Tab ...
Route="domestic">
<ShellContent ...
Route="cats" />
<ShellContent ...
Route="dogs" />
</Tab>
<ShellContent ...
Route="monkeys" />
<ShellContent ...
Route="elephants" />
<ShellContent ...
Route="bears" />
</FlyoutItem>
<ShellContent ...
Route="about" />
...
</Shell>
Poznámka:
Všechny položky v hierarchii prostředí mají přidruženou trasu. Pokud trasu nenastavíte, vygeneruje se za běhu. U generovaných tras ale není zaručeno, že budou konzistentní v různých relacích aplikací.
Výše uvedený příklad vytvoří následující hierarchii tras, kterou lze použít v programové navigaci:
animals
domestic
cats
dogs
monkeys
elephants
bears
about
Chcete-li přejít k objektu ShellContent
pro trasu dogs
, absolutní identifikátor URI trasy je //animals/domestic/dogs
. Podobně pokud chcete přejít k objektu ShellContent
pro trasu about
, absolutní identifikátor URI trasy je //about
.
Upozorňující
Pokud ArgumentException
se zjistí duplicitní trasa, vyvolá se při spuštění aplikace. Tato výjimka se vyvolá také v případě, že dvě nebo více tras na stejné úrovni v hierarchii sdílí název trasy.
Registrace tras stránky podrobností
V konstruktoru Shell
podtřídy nebo v jakémkoli jiném umístění, které se spouští před vyvoláním trasy, je možné explicitně zaregistrovat další trasy pro všechny stránky podrobností, které nejsou reprezentovány v hierarchii vizuálů prostředí. To se provádí pomocí Routing.RegisterRoute
metody:
Routing.RegisterRoute("monkeydetails", typeof(MonkeyDetailPage));
Routing.RegisterRoute("beardetails", typeof(BearDetailPage));
Routing.RegisterRoute("catdetails", typeof(CatDetailPage));
Routing.RegisterRoute("dogdetails", typeof(DogDetailPage));
Routing.RegisterRoute("elephantdetails", typeof(ElephantDetailPage));
Tento příklad registruje stránky podrobností, které nejsou definovány v Shell
podtřídě jako trasy. Tyto stránky podrobností se pak dají procházet pomocí navigace založené na identifikátoru URI, a to odkudkoliv v aplikaci. Trasy pro tyto stránky se označují jako globální trasy.
Upozorňující
Vyvolá se chyba ArgumentException
, pokud Routing.RegisterRoute
se metoda pokusí zaregistrovat stejnou trasu na dva nebo více různých typů.
Případně je možné stránky v případě potřeby zaregistrovat na různých hierarchiích tras:
Routing.RegisterRoute("monkeys/details", typeof(MonkeyDetailPage));
Routing.RegisterRoute("bears/details", typeof(BearDetailPage));
Routing.RegisterRoute("cats/details", typeof(CatDetailPage));
Routing.RegisterRoute("dogs/details", typeof(DogDetailPage));
Routing.RegisterRoute("elephants/details", typeof(ElephantDetailPage));
Tento příklad umožňuje kontextovou navigaci na stránce, kde navigace na trasu details
ze stránky pro trasu monkeys
MonkeyDetailPage
zobrazí . Podobně se zobrazí přechod na trasu details
ze stránky trasy pro trasu elephants
ElephantDetailPage
. Další informace naleznete v tématu Kontextová navigace.
Poznámka:
Stránky, jejichž trasy byly zaregistrovány v Routing.RegisterRoute
metodě, lze v případě potřeby zrušit registraci s metodou Routing.UnRegisterRoute
.
Provádění navigace
Chcete-li provést navigaci, musí být nejprve získán odkaz na podtřídu Shell
. Tento odkaz lze získat přetypováním App.Current.MainPage
vlastnosti na Shell
objekt nebo prostřednictvím Shell.Current
vlastnosti. Navigaci pak lze provést voláním GoToAsync
metody na objektu Shell
. Tato metoda přejde na a ShellNavigationState
vrátí Task
, která se dokončí po dokončení animace navigace. Objekt ShellNavigationState
je vytvořen metodou GoToAsync
, z string
, nebo Uri
, a má jeho Location
vlastnost nastavena string
na hodnotu nebo Uri
argument.
Důležité
Když se trasa z hierarchie vizuálů prostředí přepíná na, nevytvoří se zásobník navigace. Pokud se ale na stránku, která není v hierarchii vizuálů prostředí, přejde, vytvoří se navigační zásobník.
Aktuální stav navigace objektu Shell
lze načíst prostřednictvím Shell.Current.CurrentState
vlastnosti, která zahrnuje identifikátor URI zobrazené trasy ve Location
vlastnosti.
Absolutní trasy
Navigaci lze provést zadáním platného absolutního identifikátoru URI jako argumentu metody GoToAsync
:
await Shell.Current.GoToAsync("//animals/monkeys");
Tento příklad přejde na stránku trasy s trasou monkeys
definovanou v objektu ShellContent
. Objekt ShellContent
, který představuje trasu monkeys
, je podřízeným objektem FlyoutItem
, jehož trasa je animals
.
Relativní trasy
Navigaci lze provést také zadáním platného relativního identifikátoru URI jako argumentu metody GoToAsync
. Systém směrování se pokusí shodovat s identifikátorem URI objektu ShellContent
. Proto pokud jsou všechny trasy v aplikaci jedinečné, lze navigaci provést pouze zadáním jedinečného názvu trasy jako relativního identifikátoru URI.
Podporují se následující relativní formáty tras:
Formát | Popis |
---|---|
cesta | Hierarchie tras bude prohledána zadanou trasou směrem nahoru od aktuální pozice. Odpovídající stránka se odešle do navigačního zásobníku. |
/cesta | Hierarchie tras bude prohledána ze zadané trasy směrem dolů od aktuální pozice. Odpovídající stránka se odešle do navigačního zásobníku. |
//cesta | Hierarchie tras bude prohledána zadanou trasou směrem nahoru od aktuální pozice. Odpovídající stránka nahradí zásobník navigace. |
///cesta | Hierarchie tras bude prohledána zadanou trasu směrem dolů od aktuální pozice. Odpovídající stránka nahradí zásobník navigace. |
Následující příklad přejde na stránku trasy monkeydetails
:
await Shell.Current.GoToAsync("monkeydetails");
V tomto příkladu monkeyDetails
se trasa vyhledá v hierarchii, dokud nenajde odpovídající stránku. Po nalezení stránky se nasdílí do navigačního zásobníku.
Kontextová navigace
Relativní trasy umožňují kontextovou navigaci. Představte si například následující hierarchii tras:
monkeys
details
bears
details
Když se zobrazí registrovaná stránka pro trasu monkeys
, zobrazí se při přechodu na details
trasu registrovaná stránka pro trasu monkeys/details
. Podobně když se zobrazí registrovaná stránka pro trasu bears
, zobrazí se při přechodu na details
trasu registrovaná stránka pro trasu bears/details
. Informace o tom, jak v tomto příkladu zaregistrovat trasy, najdete v tématu Registrace tras stránky.
Zpětná navigace
Zpětnou navigaci lze provést zadáním "." jako argumentu GoToAsync
metody:
await Shell.Current.GoToAsync("..");
Zpětná navigace s "." lze také kombinovat s trasou:
await Shell.Current.GoToAsync("../route");
V tomto příkladu se provede zpětná navigace a pak přejde na zadanou trasu.
Důležité
Navigace zpět a do zadané trasy je možná pouze v případě, že zpětná navigace umístí vás na aktuální místo v hierarchii tras a přejde na zadanou trasu.
Podobně je možné několikrát přecházet zpět a pak přejít na zadanou trasu:
await Shell.Current.GoToAsync("../../route");
V tomto příkladu se zpětná navigace provádí dvakrát a pak navigace na zadanou trasu.
Kromě toho je možné data předávat prostřednictvím vlastností dotazu při procházení dozadu:
await Shell.Current.GoToAsync($"..?parameterToPassBack={parameterValueToPassBack}");
V tomto příkladu se provede zpětná navigace a hodnota parametru dotazu se předá parametru dotazu na předchozí stránce.
Poznámka:
Parametry dotazu je možné připojit k jakémukoli zpětnému navigačnímu požadavku.
Další informace o předávání dat při navigaci naleznete v tématu Předávání dat.
Neplatné trasy
Následující formáty tras jsou neplatné:
Formát | Vysvětlení |
---|---|
//nebo ///page | Globální trasy momentálně nemůžou být jedinou stránkou v navigačním zásobníku. Proto absolutní směrování na globální trasy není podporováno. |
Použití těchto formátů tras způsobí Exception
vyvolání.
Upozorňující
Při pokusu o přechod na neexistující trasu ArgumentException
dojde k vyvolání výjimky.
Ladění navigace
Některé třídy prostředí jsou zdobeny DebuggerDisplayAttribute
, který určuje, jak třída nebo pole je zobrazen ladicí program. To může pomoct ladit požadavky navigace zobrazením dat souvisejících s navigačním požadavkem. Například následující snímek obrazovky ukazuje CurrentItem
a CurrentState
vlastnosti objektu Shell.Current
:
V tomto příkladu vlastnost CurrentItem
typu FlyoutItem
, zobrazí název a trasu objektu FlyoutItem
. CurrentState
Podobně vlastnost typu ShellNavigationState
, zobrazí identifikátor URI zobrazené trasy v rámci aplikace Shell.
Navigační zásobník
Třída Tab
definuje vlastnost typu IReadOnlyList<Page>
, která představuje aktuální navigační zásobník v rámci Tab
Stack
. Třída také poskytuje následující přepisovatelné navigační metody:
GetNavigationStack
, vrátíIReadOnlyList<Page>
aktuální navigační zásobník.OnInsertPageBefore
volá se, kdyžINavigation.InsertPageBefore
je volána.OnPopAsync
, vrátíTask<Page>
a je volána přiINavigation.PopAsync
zavolání.OnPopToRootAsync
, vrátíTask
a je volána přiINavigation.OnPopToRootAsync
zavolání.OnPushAsync
, vrátíTask
a je volána přiINavigation.PushAsync
zavolání.OnRemovePage
volá se, kdyžINavigation.RemovePage
je volána.
Následující příklad ukazuje, jak přepsat metodu OnRemovePage
:
public class MyTab : Tab
{
protected override void OnRemovePage(Page page)
{
base.OnRemovePage(page);
// Custom logic
}
}
V tomto příkladu MyTab
by se objekty měly využívat v hierarchii vizuálů prostředí místo Tab
objektů.
Události navigace
Třída Shell
definuje Navigating
událost, která se aktivuje při spuštění navigace, a to buď kvůli programové navigaci nebo interakci uživatele. Objekt ShellNavigatingEventArgs
, který doprovází Navigating
událost, poskytuje následující vlastnosti:
Vlastnost | Type | Popis |
---|---|---|
Current |
ShellNavigationState |
Identifikátor URI aktuální stránky. |
Source |
ShellNavigationSource |
Typ navigace, ke kterému došlo. |
Target |
ShellNavigationState |
Identifikátor URI představující umístění navigace. |
CanCancel |
bool |
Hodnota označující, jestli je možné zrušit navigaci. |
Cancelled |
bool |
Hodnota označující, jestli byla navigace zrušena. |
Kromě toho třída poskytuje metoduCancel
, ShellNavigatingEventArgs
kterou lze použít ke zrušení navigace, a GetDeferral
metoda, která vrací ShellNavigatingDeferral
token, který lze použít k dokončení navigace. Další informace o odložení navigace najdete v tématu Odložení navigace.
Třída Shell
také definuje Navigated
událost, která se aktivuje po dokončení navigace. Objekt ShellNavigatedEventArgs
, který doprovází Navigated
událost, poskytuje následující vlastnosti:
Vlastnost | Type | Popis |
---|---|---|
Current |
ShellNavigationState |
Identifikátor URI aktuální stránky. |
Previous |
ShellNavigationState |
Identifikátor URI předchozí stránky. |
Source |
ShellNavigationSource |
Typ navigace, ke kterému došlo. |
Důležité
Metoda OnNavigating
se volá, když se Navigating
událost aktivuje. OnNavigated
Podobně se volá metoda, když se Navigated
událost aktivuje. Obě metody je možné přepsat v Shell
podtřídě za účelem zachycení požadavků na navigaci.
Obě ShellNavigatedEventArgs
třídy mají Source
vlastnosti typu ShellNavigationSource
.ShellNavigatingEventArgs
Tento výčet poskytuje následující hodnoty:
Unknown
Push
Pop
PopToRoot
Insert
Remove
ShellItemChanged
ShellSectionChanged
ShellContentChanged
Proto lze navigaci zachytit v OnNavigating
přepsání a akce lze provádět na základě zdroje navigace. Následující kód například ukazuje, jak zrušit zpětnou navigaci, pokud jsou data na stránce neuložené:
protected override void OnNavigating(ShellNavigatingEventArgs args)
{
base.OnNavigating(args);
// Cancel any back navigation.
if (args.Source == ShellNavigationSource.Pop)
{
args.Cancel();
}
// }
Odložení navigace
Navigace v prostředí může být zachycena a dokončena nebo zrušena na základě volby uživatele. Toho lze dosáhnout přepsáním OnNavigating
metody v Shell
podtřídě a voláním GetDeferral
metody na objektu ShellNavigatingEventArgs
. Tato metoda vrátí ShellNavigatingDeferral
token, který má metodu Complete
, kterou lze použít k dokončení požadavku navigace:
public MyShell : Shell
{
// ...
protected override async void OnNavigating(ShellNavigatingEventArgs args)
{
base.OnNavigating(args);
ShellNavigatingDeferral token = args.GetDeferral();
var result = await DisplayActionSheet("Navigate?", "Cancel", "Yes", "No");
if (result != "Yes")
{
args.Cancel();
}
token.Complete();
}
}
V tomto příkladu se zobrazí seznam akcí, který uživatele vyzve k dokončení žádosti o navigaci nebo ji zruší. Navigace je zrušena vyvoláním Cancel
metody v objektu ShellNavigatingEventArgs
. Navigace je dokončena vyvoláním Complete
metody na ShellNavigatingDeferral
tokenu, který byla načtena metodou GetDeferral
objektu ShellNavigatingEventArgs
.
Upozorňující
Metoda GoToAsync
vyvolá InvalidOperationException
výjimku, pokud se uživatel pokusí přejít, pokud existuje čekající odložení navigace.
Předání dat
Data je možné předat jako parametry dotazu při programové navigaci na základě identifikátoru URI. Toho dosáhnete připojením ?
za trasou, za kterou následuje ID =
parametru dotazu a hodnotou. Například následující kód se spustí v ukázkové aplikaci, když uživatel vybere slon na :ElephantsPage
async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
await Shell.Current.GoToAsync($"elephantdetails?name={elephantName}");
}
Tento příklad kódu načte aktuálně vybraný slon v objektu CollectionView
a přejde na trasu elephantdetails
, která se předává elephantName
jako parametr dotazu.
K příjmu navigačních dat existují dva přístupy:
- Třída, která představuje stránku, na kterou se přechává, nebo třídu stránky
BindingContext
, lze dekorovat pomocí parametruQueryPropertyAttribute
každého dotazu. Další informace naleznete v tématu Zpracování navigačních dat pomocí atributů vlastností dotazu. - Třída, která představuje stránku, na kterou se prochází, nebo třída stránky
BindingContext
, může implementovatIQueryAttributable
rozhraní. Další informace naleznete v tématu Zpracování navigačních dat pomocí jedné metody.
Zpracování navigačních dat pomocí atributů vlastností dotazu
Navigační data lze přijmout dekorací přijímající třídy s parametrem QueryPropertyAttribute
každého dotazu:
[QueryProperty(nameof(Name), "name")]
public partial class ElephantDetailPage : ContentPage
{
public string Name
{
set
{
LoadAnimal(value);
}
}
...
void LoadAnimal(string name)
{
try
{
Animal animal = ElephantData.Elephants.FirstOrDefault(a => a.Name == name);
BindingContext = animal;
}
catch (Exception)
{
Console.WriteLine("Failed to load animal.");
}
}
}
První argument pro QueryPropertyAttribute
určuje název vlastnosti, která obdrží data, s druhým argumentem určujícím ID parametru dotazu. Proto výše uvedený příklad určuje, QueryPropertyAttribute
že Name
vlastnost obdrží data předaná v parametru name
dotazu z identifikátoru URI volání GoToAsync
metody. Vlastnost Name
setter volá metodu LoadAnimal
načtení objektu Animal
pro name
, a nastaví ho jako BindingContext
stránku.
Poznámka:
Hodnoty parametrů dotazu přijaté prostřednictvím QueryPropertyAttribute
dekódované adresy URL jsou automaticky dekódovány.
Zpracování navigačních dat pomocí jedné metody
Navigační data lze přijmout implementací IQueryAttributable
rozhraní v přijímající třídě. Rozhraní IQueryAttributable
určuje, že implementovat třídu musí implementovat metodu ApplyQueryAttributes
. Tato metoda má query
argument typu IDictionary<string, string>
, který obsahuje všechna data předaná během navigace. Každý klíč ve slovníku je ID parametru dotazu s hodnotou parametru dotazu. Výhodou tohoto přístupu je, že navigační data je možné zpracovat pomocí jedné metody, což může být užitečné, pokud máte více položek navigačních dat, které vyžadují zpracování jako celek.
Následující příklad ukazuje třídu modelu zobrazení, která implementuje IQueryAttributable
rozhraní:
public class MonkeyDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
public Animal Monkey { get; private set; }
public void ApplyQueryAttributes(IDictionary<string, string> query)
{
// The query parameter requires URL decoding.
string name = HttpUtility.UrlDecode(query["name"]);
LoadAnimal(name);
}
void LoadAnimal(string name)
{
try
{
Monkey = MonkeyData.Monkeys.FirstOrDefault(a => a.Name == name);
OnPropertyChanged("Monkey");
}
catch (Exception)
{
Console.WriteLine("Failed to load animal.");
}
}
...
}
V tomto příkladu ApplyQueryAttributes
metoda načte hodnotu parametru name
dotazu z identifikátoru URI volání GoToAsync
metody. LoadAnimal
Pak je volána metoda k načtení objektuAnimal
, kde je nastavena jako hodnota Monkey
vlastnosti, která je vázána na data.
Důležité
Hodnoty parametrů dotazu přijaté přes IQueryAttributable
rozhraní nejsou automaticky dekódovány adresou URL.
Předání a zpracování více parametrů dotazu
Více parametrů dotazu lze předat jejich propojením s &
. Například následující kód předá dvě datové položky:
async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
string elephantLocation = (e.CurrentSelection.FirstOrDefault() as Animal).Location;
await Shell.Current.GoToAsync($"elephantdetails?name={elephantName}&location={elephantLocation}");
}
Tento příklad kódu načte aktuálně vybraný slon v objektu CollectionView
, a přejde na trasu elephantdetails
, předává elephantName
a elephantLocation
jako parametry dotazu.
Chcete-li přijmout více položek dat, třída, která představuje stránku, na kterou se přechází, nebo třídu stránky BindingContext
, může být zdobena QueryPropertyAttribute
pro každý parametr dotazu:
[QueryProperty(nameof(Name), "name")]
[QueryProperty(nameof(Location), "location")]
public partial class ElephantDetailPage : ContentPage
{
public string Name
{
set
{
// Custom logic
}
}
public string Location
{
set
{
// Custom logic
}
}
...
}
V tomto příkladu je třída vyzdobena parametrem QueryPropertyAttribute
každého dotazu. První QueryPropertyAttribute
určuje, že Name
vlastnost obdrží data předaná v parametru name
dotazu, zatímco druhá QueryPropertyAttribute
určuje, že Location
vlastnost obdrží data předaná v parametru location
dotazu. V obou případech jsou hodnoty parametrů dotazu zadány v identifikátoru URI volání GoToAsync
metody.
Další možností je zpracování navigačních dat jedinou metodou implementací IQueryAttributable
rozhraní třídy, která představuje stránku, na kterou se prochází, nebo třídy stránky BindingContext
:
public class ElephantDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
public Animal Elephant { get; private set; }
public void ApplyQueryAttributes(IDictionary<string, string> query)
{
string name = HttpUtility.UrlDecode(query["name"]);
string location = HttpUtility.UrlDecode(query["location"]);
...
}
...
}
V tomto příkladu ApplyQueryAttributes
metoda načte hodnotu name
parametrů dotazu location
z identifikátoru URI volání GoToAsync
metody.
Chování tlačítka Zpět
Vzhled a chování tlačítka Zpět lze předefinovat nastavením BackButtonBehavior
připojené vlastnosti na BackButtonBehavior
objekt. Třída BackButtonBehavior
definuje následující vlastnosti:
Command
, typuICommand
, který se spustí při stisknutí tlačítka Zpět.CommandParameter
, typuobject
, což je parametr, který je předán doCommand
.IconOverride
, typuImageSource
, ikona použitá pro tlačítko Zpět.IsEnabled
, typuboolean
označuje, zda je tlačítko zpět povoleno. Výchozí hodnota jetrue
.TextOverride
, typustring
, text použitý pro tlačítko Zpět.
Všechny tyto vlastnosti jsou podporovány BindableProperty
objekty, což znamená, že vlastnosti mohou být cílem datových vazeb.
Následující kód ukazuje příklad opětovného definice vzhledu a chování tlačítka zpět:
<ContentPage ...>
<Shell.BackButtonBehavior>
<BackButtonBehavior Command="{Binding BackCommand}"
IconOverride="back.png" />
</Shell.BackButtonBehavior>
...
</ContentPage>
Ekvivalentní kód jazyka C# je:
Shell.SetBackButtonBehavior(this, new BackButtonBehavior
{
Command = new Command(() =>
{
...
}),
IconOverride = "back.png"
});
Vlastnost Command
je nastavena na ICommand
spuštění při stisknutí tlačítka Zpět a IconOverride
vlastnost je nastavena na ikonu, která se používá pro tlačítko Zpět: