Xamarin.Forms StackLayout
Alt StackLayout
görünümleri yatay veya dikey olarak tek boyutlu bir yığında düzenler. StackLayout
varsayılan olarak dikey yerleşime sahiptir. Ayrıca, diğer StackLayout
alt düzenleri içeren bir üst düzen olarak da kullanılabilir.
StackLayout
sınıfı aşağıdaki özellikleri tanımlar:
Orientation
, türündekiStackOrientation
alt görünümlerin konumlandırıldığı yönü temsil eder. Bu özelliğin varsayılan değeridirVertical
.Spacing
, türündekidouble
her alt görünüm arasındaki boşluk miktarını gösterir. Bu özelliğin varsayılan değeri, cihazdan bağımsız altı birimdir.
Bu özellikler nesneler tarafından BindableProperty
desteklenir; bu da özelliklerin veri bağlamalarının hedefleri olabileceği ve stillendirilebileceği anlamına gelir.
sınıfı StackLayout
türünde bir Children
özelliği tanımlayan sınıfından IList<T>
türetilirLayout<T>
. Children
özelliği sınıfının özelliğidir ContentProperty
Layout<T>
ve bu nedenle açıkça XAML'den ayarlanması gerekmez.
İpucu
Mümkün olan en iyi düzen performansını elde etmek için Düzen performansını iyileştirme yönergelerini izleyin.
Dikey yönlendirme
Aşağıdaki XAML'de farklı alt görünümler içeren dikey odaklı StackLayout
bir oluşturma gösterilmektedir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="StackLayoutDemos.Views.VerticalStackLayoutPage"
Title="Vertical StackLayout demo">
<StackLayout Margin="20">
<Label Text="Primary colors" />
<BoxView Color="Red" />
<BoxView Color="Yellow" />
<BoxView Color="Blue" />
<Label Text="Secondary colors" />
<BoxView Color="Green" />
<BoxView Color="Orange" />
<BoxView Color="Purple" />
</StackLayout>
</ContentPage>
Bu örnek, ve BoxView
nesnelerini içeren Label
dikey StackLayout
bir öğe oluşturur. Varsayılan olarak, alt görünümler arasında cihazdan bağımsız altı alan birimi vardır:
Eşdeğer C# kodu:
public class VerticalStackLayoutPageCS : ContentPage
{
public VerticalStackLayoutPageCS()
{
Title = "Vertical StackLayout demo";
Content = new StackLayout
{
Margin = new Thickness(20),
Children =
{
new Label { Text = "Primary colors" },
new BoxView { Color = Color.Red },
new BoxView { Color = Color.Yellow },
new BoxView { Color = Color.Blue },
new Label { Text = "Secondary colors" },
new BoxView { Color = Color.Green },
new BoxView { Color = Color.Orange },
new BoxView { Color = Color.Purple }
}
};
}
}
Not
özelliğinin Margin
değeri, bir öğe ile bitişik öğeleri arasındaki uzaklığı temsil eder. Daha fazla bilgi için bkz. Kenar Boşlukları ve Doldurma.
Yatay yönlendirme
Aşağıdaki XAML, özelliğini Horizontal
olarak ayarlayarak yatay olarak yönlendirilmiş StackLayout
bir oluşturma işlemini Orientation
gösterir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="StackLayoutDemos.Views.HorizontalStackLayoutPage"
Title="Horizontal StackLayout demo">
<StackLayout Margin="20"
Orientation="Horizontal"
HorizontalOptions="Center">
<BoxView Color="Red" />
<BoxView Color="Yellow" />
<BoxView Color="Blue" />
<BoxView Color="Green" />
<BoxView Color="Orange" />
<BoxView Color="Purple" />
</StackLayout>
</ContentPage>
Bu örnek, alt görünümler BoxView
arasında cihazdan bağımsız altı boşluk içeren yatay StackLayout
bir nesne oluşturur:
Eşdeğer C# kodu:
public HorizontalStackLayoutPageCS()
{
Title = "Horizontal StackLayout demo";
Content = new StackLayout
{
Margin = new Thickness(20),
Orientation = StackOrientation.Horizontal,
HorizontalOptions = LayoutOptions.Center,
Children =
{
new BoxView { Color = Color.Red },
new BoxView { Color = Color.Yellow },
new BoxView { Color = Color.Blue },
new BoxView { Color = Color.Green },
new BoxView { Color = Color.Orange },
new BoxView { Color = Color.Purple }
}
};
}
Alt görünümler arasındaki boşluk
içindeki alt görünümler StackLayout
arasındaki aralık, özelliği bir double
değere Spacing
ayarlanarak değiştirilebilir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="StackLayoutDemos.Views.StackLayoutSpacingPage"
Title="StackLayout Spacing demo">
<StackLayout Margin="20"
Spacing="0">
<Label Text="Primary colors" />
<BoxView Color="Red" />
<BoxView Color="Yellow" />
<BoxView Color="Blue" />
<Label Text="Secondary colors" />
<BoxView Color="Green" />
<BoxView Color="Orange" />
<BoxView Color="Purple" />
</StackLayout>
</ContentPage>
Bu örnek, aralarında boşluk olmayan bir dikey StackLayout
içeren Label
ve BoxView
nesneleri oluşturur:
İpucu
Özellik, Spacing
alt görünümlerin çakışmasını sağlamak için negatif değerlere ayarlanabilir.
Eşdeğer C# kodu:
public class StackLayoutSpacingPageCS : ContentPage
{
public StackLayoutSpacingPageCS()
{
Title = "StackLayout Spacing demo";
Content = new StackLayout
{
Margin = new Thickness(20),
Spacing = 0,
Children =
{
new Label { Text = "Primary colors" },
new BoxView { Color = Color.Red },
new BoxView { Color = Color.Yellow },
new BoxView { Color = Color.Blue },
new Label { Text = "Secondary colors" },
new BoxView { Color = Color.Green },
new BoxView { Color = Color.Orange },
new BoxView { Color = Color.Purple }
}
};
}
}
Alt görünümlerin konumu ve boyutu
içindeki alt görünümlerin boyutu ve konumu, alt görünümlerin StackLayout
HeightRequest
ve özelliklerin değerlerine ve WidthRequest
bunların HorizontalOptions
ve VerticalOptions
özelliklerinin değerlerine bağlıdır. Dikeyde StackLayout
alt görünümler, boyutları açıkça ayarlı olmadığında kullanılabilir genişliği dolduracak şekilde genişler. Benzer şekilde, yatay StackLayout
bir içinde alt görünümler, boyutları açıkça ayarlı olmadığında kullanılabilir yüksekliği dolduracak şekilde genişler.
HorizontalOptions
bir StackLayout
öğesinin ve VerticalOptions
özellikleri ve alt görünümleri, iki düzen tercihini kapsayan LayoutOptions
yapıdan alanlara ayarlanabilir:
- Hizalama , alt görünümün üst düzeni içindeki konumunu ve boyutunu belirler.
- Genişletme , alt görünümün kullanılabilir durumdaysa fazladan alan kullanması gerekip gerekmediğini gösterir.
İpucu
gerekmedikçe ve VerticalOptions
özelliklerini StackLayout
ayarlamayınHorizontalOptions
. varsayılan değerleri LayoutOptions.Fill
ve LayoutOptions.FillAndExpand
en iyi düzen iyileştirmesine izin verir. Bu özellikleri değiştirmenin bir maliyeti vardır ve bunları varsayılan değerlere geri ayarlarken bile bellek tüketir.
Hizalama
Aşağıdaki XAML örneği, içindeki her alt görünümde StackLayout
hizalama tercihlerini ayarlar:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="StackLayoutDemos.Views.AlignmentPage"
Title="Alignment demo">
<StackLayout Margin="20">
<Label Text="Start"
BackgroundColor="Gray"
HorizontalOptions="Start" />
<Label Text="Center"
BackgroundColor="Gray"
HorizontalOptions="Center" />
<Label Text="End"
BackgroundColor="Gray"
HorizontalOptions="End" />
<Label Text="Fill"
BackgroundColor="Gray"
HorizontalOptions="Fill" />
</StackLayout>
</ContentPage>
Bu örnekte, nesnelerin içindeki StackLayout
konumlarını denetlemek için hizalama tercihleri ayarlanırLabel
. , , ve alanları, üst StackLayout
içindeki nesnelerin hizalamasını Label
tanımlamak için kullanılır:Fill
End
Center
Start
StackLayout
yalnızca StackLayout
yönünün tersindeki alt görünümlerde bulunan hizalama tercihlerini dikkate alır. Bu nedenle dikey StackLayout
içindeki Label
alt görünümleri, HorizontalOptions
özelliklerini şu hizalama alanlarından birine göre ayarlar:
Start
, öğesinin sol tarafına konumlandıranLabel
.StackLayout
Center
:Label
öğesiniStackLayout
içinde ortalar.End
, öğesini öğesini sağ tarafına konumlandıranLabel
StackLayout
.Fill
:Label
öğesininStackLayout
öğesinin genişliğine uydurulmasını sağlar.
Eşdeğer C# kodu:
public class AlignmentPageCS : ContentPage
{
public AlignmentPageCS()
{
Title = "Alignment demo";
Content = new StackLayout
{
Margin = new Thickness(20),
Children =
{
new Label { Text = "Start", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.Start },
new Label { Text = "Center", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.Center },
new Label { Text = "End", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.End },
new Label { Text = "Fill", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.Fill }
}
};
}
}
Genişleme
Aşağıdaki XAML örneği, içindeki her Label
StackLayout
birinde genişletme tercihlerini ayarlar:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="StackLayoutDemos.Views.ExpansionPage"
Title="Expansion demo">
<StackLayout Margin="20">
<BoxView BackgroundColor="Red"
HeightRequest="1" />
<Label Text="Start"
BackgroundColor="Gray"
VerticalOptions="StartAndExpand" />
<BoxView BackgroundColor="Red"
HeightRequest="1" />
<Label Text="Center"
BackgroundColor="Gray"
VerticalOptions="CenterAndExpand" />
<BoxView BackgroundColor="Red"
HeightRequest="1" />
<Label Text="End"
BackgroundColor="Gray"
VerticalOptions="EndAndExpand" />
<BoxView BackgroundColor="Red"
HeightRequest="1" />
<Label Text="Fill"
BackgroundColor="Gray"
VerticalOptions="FillAndExpand" />
<BoxView BackgroundColor="Red"
HeightRequest="1" />
</StackLayout>
</ContentPage>
Bu örnekte, içindeki boyutlarını StackLayout
denetlemek için nesnelerde Label
genişletme tercihleri ayarlanır. StartAndExpand
, CenterAndExpand
, EndAndExpand
ve FillAndExpand
alanları hizalama tercihini tanımlamak için kullanılır ve öğesinin Label
üst StackLayout
öğesinde kullanılabilirse daha fazla alan kaplayıp kaplamayacağını belirtir:
StackLayout
alt görünümleri ancak bulunduğu yönde genişletebilir. Bu nedenle dikey StackLayout
, VerticalOptions
özellikleri genişletme alanlarından biri olarak ayarlanmış olan Label
alt görünümlerini genişletebilir. Bu da dikey hizalama için her bir Label
öğesinin StackLayout
içinde aynı alanı kaplayacağı anlamına gelir. Ancak yalnızca VerticalOptions
özelliği FillAndExpand
olarak ayarlanmış olan Label
öğesinin boyutu farklı olur.
İpucu
kullanırken StackLayout
, yalnızca bir alt görünümün olarak LayoutOptions.Expands
ayarlandığından emin olun. Bu özellik, belirtilen alt öğeye verebileceği en büyük alanı StackLayout
kaplamasını sağlar ve bu hesaplamaları birden çok kez yapmak boşa harcanabilir.
Eşdeğer C# kodu:
public ExpansionPageCS()
{
Title = "Expansion demo";
Content = new StackLayout
{
Margin = new Thickness(20),
Children =
{
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "StartAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.StartAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "CenterAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.CenterAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "EndAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.EndAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "FillAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.FillAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 }
}
};
}
Önemli
Bir StackLayout
içindeki alanın tamamı kullanıldığında genişletme tercihlerinin herhangi bir etkisi olmaz.
Hizalama ve genişletme hakkında daha fazla bilgi için, bkz . içindeki Xamarin.FormsDüzen Seçenekleri.
İç içe StackLayout nesneleri
, StackLayout
iç içe alt nesneleri veya diğer alt StackLayout
düzenleri içeren bir üst düzen olarak kullanılabilir.
Aşağıdaki XAML iç içe StackLayout
nesne örneği gösterir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="StackLayoutDemos.Views.CombinedStackLayoutPage"
Title="Combined StackLayouts demo">
<StackLayout Margin="20">
...
<Frame BorderColor="Black"
Padding="5">
<StackLayout Orientation="Horizontal"
Spacing="15">
<BoxView Color="Red" />
<Label Text="Red"
FontSize="Large"
VerticalOptions="Center" />
</StackLayout>
</Frame>
<Frame BorderColor="Black"
Padding="5">
<StackLayout Orientation="Horizontal"
Spacing="15">
<BoxView Color="Yellow" />
<Label Text="Yellow"
FontSize="Large"
VerticalOptions="Center" />
</StackLayout>
</Frame>
<Frame BorderColor="Black"
Padding="5">
<StackLayout Orientation="Horizontal"
Spacing="15">
<BoxView Color="Blue" />
<Label Text="Blue"
FontSize="Large"
VerticalOptions="Center" />
</StackLayout>
</Frame>
...
</StackLayout>
</ContentPage>
Bu örnekte, üst StackLayout
öğe nesnelerin içinde Frame
iç içe StackLayout
nesneler içerir. Üst öğe StackLayout
dikey olarak yönlendirilirken, alt StackLayout
nesneler yatay olarak yönlendirilir:
Önemli
Nesneleri ve diğer düzenleri ne kadar derin iç içe StackLayout
yerleştirdiyseniz, iç içe yerleştirilmiş düzenler performansı o kadar fazla etkiler. Daha fazla bilgi için bkz . Doğru düzeni seçme.
Eşdeğer C# kodu:
public class CombinedStackLayoutPageCS : ContentPage
{
public CombinedStackLayoutPageCS()
{
Title = "Combined StackLayouts demo";
Content = new StackLayout
{
Margin = new Thickness(20),
Children =
{
new Label { Text = "Primary colors" },
new Frame
{
BorderColor = Color.Black,
Padding = new Thickness(5),
Content = new StackLayout
{
Orientation = StackOrientation.Horizontal,
Spacing = 15,
Children =
{
new BoxView { Color = Color.Red },
new Label { Text = "Red", FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), VerticalOptions = LayoutOptions.Center }
}
}
},
new Frame
{
BorderColor = Color.Black,
Padding = new Thickness(5),
Content = new StackLayout
{
Orientation = StackOrientation.Horizontal,
Spacing = 15,
Children =
{
new BoxView { Color = Color.Yellow },
new Label { Text = "Yellow", FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), VerticalOptions = LayoutOptions.Center }
}
}
},
new Frame
{
BorderColor = Color.Black,
Padding = new Thickness(5),
Content = new StackLayout
{
Orientation = StackOrientation.Horizontal,
Spacing = 15,
Children =
{
new BoxView { Color = Color.Blue },
new Label { Text = "Blue", FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), VerticalOptions = LayoutOptions.Center }
}
}
},
// ...
}
};
}
}