NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Lekce 3 - Pozicování ve WinUI 3 a C# .NET

V minulé lekci, Jazyk XAML ve WinUI 3 a C# .NET, jsme si uvedli základní syntaxi jazyka XAML.

V dnešním WinUI 3 tutoriálu se naučíme pozicovat ovládací prvky. Zmíníme layouty, absolutní a relativní pozici, DIP, vnější a vnitřní okraje a velikost.

Budeme pracovat s naší aplikací z lekce Úvod do Windows App SDK a WinUI 3.

Layouty

Základním nástrojem pro pozicování ovládacích prvků ve WinUI 3 jsou komponenty označované jako layouts (počeštěně layouty) nebo také kontejnery či panely. Jedná se o komponenty, které mohou obsahovat libovolné množství dalších komponent a které řeší jejich rozmístění. Layout tedy použijeme ve chvíli, kdy chceme do okna vložit více než jeden ovládací prvek. Layouty můžeme samozřejmě zanořovat do sebe.

StackPanel

S jedním layoutem jsme se již setkali, konkrétně s layoutem StackPanel, v němž máme umístěný jeden popisek:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
    <TextBlock Text="Pozdrav zWinUI 3 aplikace" />
</StackPanel>

Tomuto layoutu můžeme pomocí atributu Orientation nastavit orientaci, která ovlivňuje jeho chování:

  • Horizontal – Prvky skládá za sebe směrem zleva doprava.
  • Vertical – Prvky skládá pod sebe směrem shora dolů.

Zkusme si schválně do elementu <StackPanel> vložit více popisků <TextBlock> a změňme orientaci na vertikální:

<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
    <TextBlock Text="Pozdrav z WinUI 3 aplikace" />
    <TextBlock Text="Pozdrav z WinUI 3 aplikace" />
    <TextBlock Text="Pozdrav z WinUI 3 aplikace" />
</StackPanel>

Popisky se opravdu zobrazí pod sebou:

Tři popisky pod sebou - WinUI 3 - Okenní aplikace v C# .NET

Další layouty, jako je například Grid, si představíme dále v kurzu.

Absolutní a relativní pozice

Vraťme se nyní zpátky k jedinému popisku. Jelikož chceme jen jeden popisek, můžeme jej umístit přímo do okna bez použití jakéhokoli layoutu:

<Window ...>
    <TextBlock Text="Pozdrav z WinUI 3 aplikace" />
</Window>

Absolutní pozice

Někdy potřebujeme ovládací prvek umístit na konkrétní souřadnice, tedy na absolutní pozici. Ve WinUI 3 lze prvky vkládat na absolutní pozici v layoutu zvaném Canvas. Jelikož se tento layout moc nepoužívá, nebudeme si ho dnes blíže popisovat. Bez použití layoutu Canvas si můžeme pomoci okrajem. Umístěme náš popisek na souřadnice [200;128]:

<TextBlock
    Text="Pozdrav z WinUI 3 aplikace"
    Margin="200, 128, 0, 0" />

Pomocí atributu Margin jsme popisku nastavili vnější okraje na 200 zleva a 128 shora. Výsledek vypadá tak, že je ovládací prvek na pozici [200;128], ale ve skutečnosti je kolem něj pouze okraj:

Popisek s nastaveným vnějším okrajem - WinUI 3 - Okenní aplikace v C# .NET

Asi největší nevýhodou používání absolutních pozic je to, že obsah okna nereaguje na roztažení, nebo dokonce změnu poměru jeho stran. Další nevýhodou je, že pokud nějaký ovládací prvek zvětší svou velikost, musíme ručně posunout okolní prvky, aby se obsah okna nerozsypal. To může být u větších aplikací opravdu velmi nepřehledné.

Relativní pozice

Relativní pozice na rozdíl od absolutní respektuje okolní prvky i samotné okno. Upravme XAML kód elementu <TextBlock> tak, aby se centroval do elementu, ve kterém je vložený. V našem případě bude ve středu elementu <Window>:

<TextBlock
    Text="Pozdrav z WinUI 3 aplikace"
    HorizontalAlignment="Center"
    VerticalAlignment="Center" />

HorizontalAlignment nastavuje vodorovné zarovnání a VerticalAlignment svislé. Když aplikaci nyní spustíme a okno například zúžíme svisle a roztáhneme vodorovně, TextBlock je stále uprostřed:

Centrovaný popisek - WinUI 3 - Okenní aplikace v C# .NET

Okraje

Všechny komponenty, které lze vložit do okna, mají vnější a některé i vnitřní okraje. Vnějším se říká Margin a těm vnitřním Padding:

Margin a Padding ve WPF v C# .NET - WinUI 3 - Okenní aplikace v C# .NET

Každý okraj můžeme nastavit jinak pro různé strany nebo ho na všech stranách nastavit na jednu velikost.

Odebereme z okna TextBlock a místo něj vložíme tlačítko pomocí následujícího XAML kódu:

<Button
    Content="Tlačítko"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    Width="75"
    Margin="100, 0, 0, 0"
    Padding="0, 50, 0, 0" />

Výsledek vypadá takto:

Tlačítko s nastavenými okraji - WinUI 3 - Okenní aplikace v C# .NET

Můžeme vidět, že ačkoli je tlačítko zarovnané doprostřed, jeho vnější okraj je na levé straně 100. Tuto hodnotu jsme nastavili pomocí Margin. U vnitřního okraje tlačítka naopak vidíme, že horní je výrazně větší než ostatní. To způsobuje hodnota 50 v Padding.

Hodnoty zadáváme v pořadí: levý, horní, pravý, dolní okraj a oddělujeme je čárkami. Také lze zadat jen jednu hodnotu, která nastaví všechny okraje na tutéž velikost. Stejně tak můžeme zadat i dvě hodnoty, jednu pro vodorovné okraje a druhou pro svislé.

Device Independent Pixels

Velikosti zadáváme v jednotkách DIP (Device Independent Pixels). 1 DIP může být buď stejný, menší, anebo větší než jeden fyzický pixel. Velikost DIP totiž závisí na hodnotě DPI (Dots Per Inch), která označuje počet bodů/pixelů na palec. Při DPI 96, což je výchozí hodnota po instalaci Windows, má 1 DIP velikost 1 fyzického pixelu na displeji. Uživatelé velkých monitorů mají nastavené vyšší DPI, 1 DIP tedy vychází např. na 1.25 fyzického pixelu.

DIP jsou velmi důležité, jelikož se dají běžně pořídit i 4K displeje, které mají 4x větší rozlišení než ty, které jsou nyní standardem. Pokud by se místo DIP používaly obyčejné pixely, naše aplikace by nebyla na takovém displeji téměř ani vidět. S DIP bude vypadat stále stejně, WinUI 3 tedy uzpůsobí vše za nás.

Výška a šířka komponent

Všimněme si, že jsme tlačítku v příkladu výše zadali šířku pomocí atributu Width. Obdobně bychom mohli nastavit i výšku atributem Height. Kromě DIP zde můžeme nastavit i hodnotu Auto, která je výchozí. Velikost se potom určí podle obsahu komponenty, například podle délky textu popisku tlačítka. Pomocí atributů MinWidth, MinHeight, MaxWidth a MaxHeight také můžeme nastavit minimální nebo maximální rozměr.

Zarovnání

Na konec dnešní lekce si ještě něco málo doplníme k zarovnání ovládacích prvků. Upravme XAML kód tlačítka tak, aby vypadal následovně:

<Button Content="Tlačítko" />

Tlačítko se ve svislém směru zarovná doprostřed a ve vodorovném doleva:

Výchozí zarovnání tlačítka - WinUI 3 - Okenní aplikace v C# .NET

Toto ale není výchozí chování všech prvků. Obecně platí, že pokud neurčíme zarovnání, předpokládá se v atributech HorizontalAlignment a VerticalAlignment hodnota Stretch. Ta zajistí roztažení přes celou dostupnou šířku, respektive výšku. Některé ovládací prvky však mají kvůli výchozímu stylování nastavené jiné výchozí hodnoty. To je právě případ tlačítka. Pokud bychom chtěli tlačítko roztáhnout přes celé okno, museli bychom explicitně nastavit atributy HorizontalAlignment a VerticalAlignment na Stretch:

<Button Content="Tlačítko" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />

Výsledek:

Roztažené tlačítko - WinUI 3 - Okenní aplikace v C# .NET

Atributu HorizontalAlignment můžeme nastavit následující hodnoty:

  • Center – zarovnání na střed,
  • Left – zarovnání vlevo,
  • Right – zarovnání vpravo,
  • Stretch – roztažení přes celou šířku.

U VerticalAlignment jsou hodnoty obdobné, jen místo Left a Right nastavujeme Top a Bottom. Vyzkoušejme si jednotlivé hodnoty. Ovládací prvky se zarovnávají do elementu, ve kterém jsou vložené. Tomuto elementu se říká rodičovský (anglicky parent).

V následujícím kvízu, Kvíz - Základy, XAML, pozicování ve WinUI 3 a C# .NET, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Předchozí článek
Jazyk XAML ve WinUI 3 a C# .NET
Všechny články v sekci
WinUI 3 - Okenní aplikace v C# .NET
Přeskočit článek
(nedoporučujeme)
Kvíz - Základy, XAML, pozicování ve WinUI 3 a C# .NET
Článek pro vás napsal Radek Vymětalík
Avatar
Uživatelské hodnocení:
6 hlasů
...
Aktivity