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:
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 MAUIAndExpand
opcje układu nie mają wpływu na żaden układ inny niż StackLayout.Usuń wszelkie
AndExpand
właściwości, które są ortogonalne w kierunku stosu. Jeśli na przykład element StackLayout ma element zOrientation
Vertical
elementem i ma element podrzędny z elementemHorizontalAligment="CenterAndExpand"
— opcje układu nie mają żadnego wpływu i można je usunąć.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ładAndExpand
podany w zestawie narzędzi Xamarin.Forms. W poniższym przykładzie pokazano zestaw narzędzi Xamarin.FormsStackLayout
, który używaAndExpand
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 obiekcieStackLayout
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.