Udostępnij za pośrednictwem


Zmiany zachowania układu z zestawu narzędzi Xamarin.Forms

Podczas uruchamiania uaktualnionej aplikacji wieloplatformowej interfejsu użytkownika aplikacji platformy .NET (.NET MAUI) zachowanie układu jest inne. Niektóre z nich są wynikiem zmian w wartościach odstępów między układami. Aby uzyskać więcej informacji, zobacz Zmiany wartości domyślnej z zestawu narzędzi Xamarin.Forms.

W poniższej tabeli przedstawiono dodatkowe zmiany zachowania między układami zestawu narzędzi Xamarin.Forms i .NET MAUI:

Układ Xamarin.Forms .NET MAUI Zalecenie
wszystkie W niektórych przypadkach żądania ustalania rozmiaru nie są honorowane. Żądania ustalania rozmiaru są honorowane.
Grid Kolumny i wiersze można wywnioskować z języka XAML. Kolumny i wiersze muszą być jawnie zadeklarowane. Dodaj ColumnDefinitions i RowDefinitions.
HorizontalStackLayout *AndExpand nie ma żadnego efektu.
RelativeLayout Wymaga przestrzeni nazw zgodności. Zamiast tego użyj Grid polecenia lub dodaj element xmlns dla przestrzeni nazw zgodności.
StackLayout Dzieci mogą wypełniać miejsce w kierunku układania. Elementy podrzędne są ułożone i wykraczają poza dostępną przestrzeń. Jeśli potrzebujesz widoków podrzędnych, aby wypełnić miejsce, zmień wartość na Grid.
VerticalStackLayout *AndExpand nie ma żadnego efektu.

Kontrolki MAUI platformy .NET zwykle honorować jawne żądania dotyczące rozmiaru. Jeśli poprosisz kontrolkę o 200 jednostek niezależnych od urządzenia, platforma .NET MAUI sprawi, że będzie ona kontrolować 200 jednostek szerokości, nawet jeśli kontener kontrolki ma tylko 100 jednostek szerokości.

Domyślne zmiany wartości układu z zestawu narzędzi Xamarin.Forms

Platforma Xamarin.Forms używa dowolnych wartości domyślnych dla niektórych wartości właściwości, takich jak wypełnienie, marginesy i odstępy. Program .NET MAUI zmienia te dowolne wartości właściwości na zero.

Aby zachować wartości domyślne zestawu narzędzi Xamarin.Forms w projektach, które nie ustawiają jawnych wartości, dodaj niejawne style do projektu. Aby uzyskać więcej informacji na temat niejawnych stylów, zobacz Niejawne style.

Uwaga

Szablon projektu MAUI platformy .NET zawiera słowniki zasobów, które zapewniają domyślne style dla większości kontrolek. Zaleca się stosowanie podobnego podejścia w aplikacjach przez modyfikowanie lub dziedziczenie z tych słowników zasobów.

W poniższej tabeli wymieniono wartości właściwości układu, które zostały zmienione między zestawami narzędzi Xamarin.Forms i .NET MAUI:

Właściwości Wartość zestawu narzędzi Xamarin.Forms Wartość MAUI platformy .NET
Grid.ColumnSpacing 6 0
Grid.RowSpacing 6 0
StackLayout.Spacing 6 0

Następujące style zachowują wartości domyślne zestawu narzędzi 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>

Ramka

Frame element został zastąpiony w programie .NET MAUI przez Border. Jest to jednak uwzględnione w celu ułatwienia migracji z zestawu narzędzi Xamarin.Forms. Układ .NET MAUI poprawnie mierzy się Frame Padding na wszystkich platformach, podczas gdy zestaw narzędzi Xamarin.Forms miał pewne rozbieżności między platformami. Może to spowodować, że aplikacje nie wyglądają tak samo w programie .NET MAUI. W powyższym przykładzie jest to używane, jeśli używasz wartości domyślnych.

Siatka

Największą zmianą zachowania Grid między zestawami narzędzi Xamarin.Forms i .NET MAUI jest to, że siatki nie dodają automatycznie brakujących wierszy i kolumn. Na przykład w zestawie narzędzi Xamarin.Forms można dodawać kontrolki do elementu Grid bez określania ich zachowania wiersza:

<Grid>
    <Label Text="Hello"/>
    <Label Grid.Row="1" Text="World"/>
</Grid>

W zestawie narzędzi Xamarin.Forms, mimo że nie zadeklarował, że Grid zawiera dwa wiersze, drugi wiersz zostanie automatycznie dodany. Program .NET MAUI nie robi tego. Zamiast tego należy jawnie określić, ile wierszy znajduje się w Grid obiekcie z właściwością RowDefinitions .

Ważne

Domyślnie program .NET MAUI tworzy obiekt z jedną kolumną Grid i jednym wierszem. W związku z tym nie jest konieczne ustawienie ColumnDefinitions właściwości i RowDefinitions , jeśli jest to intencja.

W zestawie narzędzi Xamarin.Forms, gdy element Label znajduje się w kolumnie, w której szerokość jej ColumnDefinition jest ustawiona na Auto, podziały wierszy, takie jak zawijanie wyrazów i obcinanie ogona niejawnie występują. W programie .NET MAUI podziały wierszy w tym scenariuszu nie występują niejawnie, ponieważ kolumna rozszerza szerokość ekranu, aby pomieścić zawartość elementu podrzędnego. Jeśli chcesz, aby element Label zawijał się na krawędzi obiektu Grid , należy ustawić odpowiednią ColumnDefinition wartość na * wartość lub .

StackLayout

Istnieje kilka różnic między układami stosu w programie .NET MAUI (StackLayout, VerticalStackLayouti ) oraz HorizontalStackLayoutStackLayout w zestawie narzędzi Xamarin.Forms.

Główną różnicą jest to, że układy stosu MAUI platformy .NET są bardzo proste. Układają swoje widoki podrzędne w jednym kierunku, aż wszystkie z nich zostaną ułożone. Będą one nadal przechodzić do ostatniego dziecka został ułożone, nawet jeśli zabiera je poza dostępną przestrzeń w kierunku stosu. W związku z tym układy stosu .NET MAUI rozmieszczają kontrolki w określonym kierunku. Nie rozdzielają przestrzeni. Jest to zupełnie inne niż zestaw narzędzi Xamarin.Forms StackLayout, który zmienia zachowanie układu na podstawie okoliczności i obecności dowolnych *AndExpand opcji układu, takich jak FillAndExpand lub CenterAndExpand. Zestaw narzędzi Xamarin.Forms StackLayout czasami dzieli przestrzeń, rozwijając się do lub zatrzymując na krawędzi kontenera. W innych przypadkach rozszerza się poza kontener.

Nowe układy stosu w programach .NET MAUI HorizontalStackLayout i VerticalStackLayout, nie rozpoznają *AndExpand opcji układu. Jeśli napotkają element podrzędny z takimi opcjami układu, po prostu traktują je tak, jakby AndExpand nie było tam. Na przykład, FillAndExpand staje się Fill. Jednak dla uproszczenia migracji z platformy Xamarin.Forms program .NET MAUI StackLayout obsługuje *AndExpand opcje układu, chociaż zostały oznaczone jako przestarzałe. Aby uniknąć ostrzeżeń dotyczących używania przestarzałych elementów członkowskich, należy przekonwertować układy, które używają *AndExpand opcji układu do odpowiedniego typu układu. Można to osiągnąć w następujący sposób:

  1. Jeśli układ jest inny niż StackLayout, usuń wszystkie zastosowania elementu AndExpand. Podobnie jak w przypadku zestawu narzędzi Xamarin.Forms w programie .NET MAUI AndExpand opcje układu nie mają wpływu na żaden układ inny niż StackLayout.

  2. Usuń wszelkie AndExpand właściwości, które są ortogonalne w kierunku stosu. Jeśli na przykład element StackLayout ma element z Orientation Verticalelementem i ma element podrzędny z elementem HorizontalAligment="CenterAndExpand" — opcje układu nie mają żadnego wpływu i można je usunąć.

  3. Jeśli w obiekcie StackLayoutistnieją jakiekolwiek pozostałe AndExpand właściwości , należy przekonwertować je StackLayout na Gridwartość . Obiekt jest Grid przeznaczony do podziału przestrzeni i zapewnia układ AndExpand podany w zestawie narzędzi Xamarin.Forms. W poniższym przykładzie pokazano zestaw narzędzi Xamarin.Forms StackLayout , który używa AndExpand właściwości:

    <StackLayout>
        <Label Text="Hello world!"/>
        <Image VerticalOptions="FillAndExpand" Source="dotnetbot.png"/>
    </StackLayout>
    

    Można to przekonwertować na element Grid w programie .NET MAUI:

    <Grid RowDefinitions="Auto, *">
        <Label Text="Hello world!"/>
        <Image Grid.Row="1" Source="dotnetbot.png"/>
    </Grid>
    

    Podczas wykonywania tej konwersji wszystkie elementy oznaczone AndExpand w obiekcie StackLayout powinny znajdować się we własnym wierszu lub kolumnie o rozmiarze * w elemecie Grid.

Ważne

Ciąg StackLayout będzie kontynuowany w kierunku stosu, dopóki nie zabraknie zawartości. Nie dzieli kontenera na tej osi. Jeśli chcesz ograniczyć zawartość do ograniczonego miejsca w kierunku, należy użyć innego układu, takiego jak Grid.

RelativeLayout

Korzystanie z programu RelativeLayout nie jest zalecane w programie .NET MAUI. Zamiast tego należy użyć wszędzie tam, gdzie Grid to możliwe.

Jeśli absolutnie potrzebujesz elementu RelativeLayout, można go znaleźć w Microsoft.Maui.Controls.Compatibility przestrzeni nazw:

<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

Chociaż ScrollView często nie jest uważany za układ, można go traktować jako układ, ponieważ służy do przewijania zawartości podrzędnej. W zestawie narzędzi Xamarin.Forms ScrollView nie zachowuje się spójnie podczas stosu. Ma ona pewne dowolne ograniczenia dotyczące minimalnego rozmiaru, które częściowo zależą od jego zawartości, i czasami kompresuje, aby umożliwić innym elementom dopasowanie do strony w StackLayout sposób niespójny, a czasami zaskakujący.

W programie .NET MAUI rozszerza ScrollView się do dowolnego rozmiaru, który ma być ograniczony, chyba że jest to ograniczone w inny sposób. Oznacza to, że wewnątrz VerticalStackLayoutobiektu , który może rozwinąć się w nieskończoność, ScrollView funkcja rozszerzy się do pełnej wysokości zawartości i nie przewija się. To zachowanie może być mylące, jeśli jesteś użytkownikiem platformy Xamarin.Forms.