Změny chování rozložení z Xamarin.Forms
Při spuštění upgradované aplikace .NET pro víceplatformní uživatelské rozhraní (.NET MAUI) si můžete všimnout, že chování rozložení se liší. Některé z nich jsou výsledkem změn hodnot pro řádkování rozložení. Další informace najdete v tématu Změny výchozí hodnoty z Xamarin.Forms.
Následující tabulka ukazuje další změny chování mezi rozloženími v Xamarin.Forms a .NET MAUI:
Rozložení | Xamarin.Forms | .NET MAUI | Doporučení |
---|---|---|---|
Všechny | V některých případech se žádosti o změnu velikosti nedotknou. | Žádosti o změnu velikosti jsou dodrženy. | |
Grid | Sloupce a řádky lze odvodit z XAML. | Sloupce a řádky musí být explicitně deklarovány. | Přidat ColumnDefinitions a RowDefinitions. |
HorizontalStackLayout | *AndExpand nemá žádný účinek. |
||
RelativeLayout | Vyžaduje obor názvů kompatibility. | Místo toho použijte Grid nebo přidejte obor názvů kompatibility xmlns . |
|
StackLayout | Děti mohou vyplnit místo ve směru skládání. | Děti jsou skládané a budou nad rámec dostupného prostoru. | Pokud potřebujete k vyplnění místa podřízená zobrazení, změňte na .Grid |
VerticalStackLayout | *AndExpand nemá žádný účinek. |
Ovládací prvky .NET MAUI obecně odpovídají explicitním požadavkům na velikost. Pokud se zeptáte, aby byl ovládací prvek široký na 200 jednotek nezávislých na zařízení, pak rozhraní .NET MAUI tuto kontrolu nastaví na šířku 200 jednotek, i když je kontejner ovládacího prvku široký jen 100 jednotek.
Změny výchozí hodnoty rozložení z Xamarin.Forms
Xamarin.Forms používá pro některé hodnoty vlastností libovolné výchozí hodnoty, například odsazení, okraje a mezery. .NET MAUI změní tyto libovolné hodnoty vlastností na nulu.
Pokud chcete zachovat výchozí hodnoty Xamarin.Forms v projektech, které nenastaví explicitní hodnoty, přidejte do projektu implicitní styly. Další informace o implicitních stylech naleznete v tématu Implicitní styly.
Poznámka:
Šablona projektu .NET MAUI obsahuje slovníky zdrojů, které poskytují výchozí styly pro většinu ovládacích prvků. Doporučuje se v aplikacích použít podobný přístup úpravou nebo děděním z těchto slovníků prostředků.
Následující tabulka uvádí hodnoty vlastností rozložení, které se změnily mezi Xamarin.Forms a .NET MAUI:
Vlastnost | Hodnota Xamarin.Forms | Hodnota .NET MAUI |
---|---|---|
Grid.ColumnSpacing |
6 | 0 |
Grid.RowSpacing |
6 | 0 |
StackLayout.Spacing |
6 | 0 |
Následující styly zachovají výchozí hodnoty Xamarin.Forms:
<!-- Forms defaults -->
<Style TargetType="Grid">
<Setter Property="ColumnSpacing" Value="6"/>
<Setter Property="RowSpacing" Value="6"/>
</Style>
<Style TargetType="StackLayout">
<Setter Property="Spacing" Value="6"/>
</Style>
<Style TargetType="Frame">
<Setter Property="Padding" Value="{OnPlatform 20,iOS=19}"/>
</Style>
Rámec
Frame byla nahrazena v .NET MAUI Border. Součástí je ale usnadnění migrace z Xamarin.Forms. Rozložení .NET MAUI správně měří Frame Padding
na všech platformách, zatímco Xamarin.Forms mělo určité nesrovnalosti mezi platformami. To může vést k tomu, že vaše aplikace nebudou v rozhraní .NET MAUI vypadat stejně. Pokud používáte výchozí hodnoty, použijete výše uvedený příklad.
Mřížka
Největší změnou chování Grid mezi Xamarin.Forms a .NET MAUI je, že mřížky automaticky nepřidají chybějící řádky a sloupce za vás. V Xamarin.Forms můžete například přidat ovládací prvky bez Grid zadání jejich chování řádků:
<Grid>
<Label Text="Hello"/>
<Label Grid.Row="1" Text="World"/>
</Grid>
V Xamarin.Forms se navzdory tomu, že Grid neobsahuje dva řádky, automaticky přidá druhý řádek. .NET MAUI to nedělá. Místo toho musíte explicitně určit, kolik řádků je v objektu Grid RowDefinitions
s vlastností.
Důležité
Ve výchozím nastavení vytvoří .NET MAUI Grid jeden sloupec a jeden řádek. Proto není nutné nastavit ColumnDefinitions
vlastnosti a RowDefinitions
vlastnosti, pokud je to váš záměr.
V Xamarin.Forms, pokud Label
je ve sloupci, kde je šířka jeho ColumnDefinition
nastavena na Auto
, konce řádků, jako je zalamování slov a koncové zkrácení implicitně dochází. V .NET MAUI se v tomto scénáři konce řádků neprojevují implicitně, protože sloupec rozšiřuje šířku obrazovky tak, aby vyhovoval obsahu dítěte. Pokud chcete Label , aby se zalomil na okraji Grid , měli byste nastavit odpovídající ColumnDefinition
*
hodnotu nebo hodnotu.
StackLayout
Mezi rozloženími zásobníku v rozhraní .NET MAUI (StackLayout, VerticalStackLayouta ) a HorizontalStackLayoutStackLayout
v Xamarin.Forms existuje několik rozdílů.
Hlavním rozdílem je, že rozložení zásobníku .NET MAUI jsou velmi jednoduchá. Jejich podřízená zobrazení se skládají jedním směrem, dokud nebudou všechny naskládané. Budou pokračovat až do posledního dítěte, a to i v případě, že je přenese nad dostupné místo ve směru stackingu. Rozložení zásobníku .NET MAUI proto uspořádávají ovládací prvky určitým směrem. Nerozdělují prostor. To se zcela liší od Xamarin.Forms StackLayout
, která mění chování rozložení na základě okolností a přítomnosti všech *AndExpand
možností rozložení, například FillAndExpand
nebo CenterAndExpand
. Xamarin.Forms StackLayout
někdy rozdělí prostor, rozšíří nebo zastaví na okraji kontejneru. V jiných případech se rozšiřuje nad rámec svého kontejneru.
Nová rozložení zásobníku v rozhraní .NET MAUI HorizontalStackLayout a VerticalStackLayoutnerozpoznávají *AndExpand
možnosti rozložení. Pokud narazí na dítě s těmito možnostmi rozložení, jednoduše s ním zachází, jako by AndExpand
tam nebyl. Například z FillAndExpand
se stane Fill
. Pro zjednodušení migrace z Xamarin.Forms však .NET MAUI StackLayout respektuje *AndExpand
možnosti rozložení, i když byly označené jako zastaralé. Abyste se vyhnuli upozorněním na používání zastaralých členů, měli byste převést rozložení, která používají *AndExpand
možnosti rozložení na odpovídající typ rozložení. Toho lze dosáhnout následujícím způsobem:
Pokud je vaše rozložení něco jiného než , StackLayoutodeberte všechna použití
AndExpand
. Stejně jako v Xamarin.Forms nemají možnosti rozložení v .NET MAUIAndExpand
žádný vliv na jiné rozložení než StackLayout.Odeberte všechny
AndExpand
vlastnosti, které jsou orthogonální směrem zásobníku. Pokud máte například s položkou StackLayoutOrientation
a má podřízenou položkuVertical
s položkouHorizontalAligment="CenterAndExpand"
- že možnosti rozložení nemají žádný vliv a je možné je odebrat.Pokud máte nějaké zbývající
AndExpand
vlastnosti v objektu StackLayout, měli byste ho StackLayout převést na .Grid Funkce A Grid je navržená k rozdělení prostoru a poskytne rozložení, kteréAndExpand
je součástí Xamarin.Forms. Následující příklad ukazuje Xamarin.FormsStackLayout
, který používáAndExpand
vlastnost:<StackLayout> <Label Text="Hello world!"/> <Image VerticalOptions="FillAndExpand" Source="dotnetbot.png"/> </StackLayout>
To lze převést na rozhraní Grid .NET MAUI:
<Grid RowDefinitions="Auto, *"> <Label Text="Hello world!"/> <Image Grid.Row="1" Source="dotnetbot.png"/> </Grid>
Při provádění tohoto převodu by všechno, co bylo označené
AndExpand
vStackLayout
řádku nebo sloupci, mělo jít ve svém vlastním řádku nebo sloupci s velikostí*
v sadě Grid.
Důležité
A StackLayout pokračuje ve svém směru stackingu, dokud nevypadá obsah. Neprovádí rozdělení kontejneru podél této osy. Pokud chcete obsah omezit na omezený prostor ve směru, měli byste použít jiné rozložení, například Grid.
RelativeLayout
RelativeLayout Použití se nedoporučuje v rozhraní .NET MAUI. Místo toho používejte Grid všude, kde je to možné.
Pokud potřebujete RelativeLayout, můžete ho Microsoft.Maui.Controls.Compatibility
najít v oboru názvů:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:compat="clr-namespace:Microsoft.Maui.Controls.Compatibility;assembly=Microsoft.Maui.Controls"
x:Class="MyMauiApp.MyPage"
Title="MyPage">
<compat:RelativeLayout>
<!-- Your code goes here -->
</compat:RelativeLayout>
</ContentPage>
ScrollView
I když ScrollView se často nepovažuje za rozložení, můžete si ho představit jako rozložení, protože se používá k posouvání podřízeného obsahu. V Xamarin.Forms ScrollView
se při stackování nechová konzistentně. Má několik libovolných omezení minimální velikosti, které závisí částečně na jeho obsahu, a někdy se zkomprimuje, aby se ostatní položky vešly na stránku způsobem StackLayout
, který je nekonzistentní a někdy překvapivý.
V .NET MAUI se rozbalí na libovolnou velikost, ScrollView kterou chce být, pokud není jinak omezené. To znamená, že uvnitř objektu VerticalStackLayout, který se může nekonečně rozšířit, ScrollView rozbalí se na celou výšku obsahu a neposoudí se. Toto chování může být matoucí, pokud jste uživatel Xamarin.Forms.