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ěří FramePadding 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 GridRowDefinitions 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.

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:

  1. 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 MAUI AndExpand žádný vliv na jiné rozložení než StackLayout.

  2. 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žku Verticals položkou HorizontalAligment="CenterAndExpand" - že možnosti rozložení nemají žádný vliv a je možné je odebrat.

  3. 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.Forms StackLayout , 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 v StackLayout řá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.