Xamarin.Forms Sekmeli Sayfa
, Xamarin.FormsTabbedPage
her sekmenin ayrıntı alanına içerik yüklemesiyle birlikte bir sekme listesi ve daha büyük bir ayrıntı alanından oluşur. Aşağıdaki ekran görüntüleri iOS ve Android'de bir TabbedPage
gösterir:
iOS'ta, sekme listesi ekranın alt kısmında görünür ve ayrıntı alanı yukarıdadır. Her sekme, alfa kanalına sahip bir PNG dosyası olması gereken bir başlık ve simgeden oluşur. Dikey yönlendirmede, sekme başlıklarının üzerinde sekme çubuğu simgeleri görünür. Yatay yönde simgeler ve başlıklar yan yana görüntülenir. Ayrıca, cihaza ve yönlendirmeye bağlı olarak normal veya kompakt bir sekme çubuğu görüntülenebilir. Beşten fazla sekme varsa, ek sekmelere erişmek için kullanılabilecek bir Diğer sekmesi görüntülenir.
Android'de, sekme listesi ekranın üst kısmında görünür ve ayrıntı alanı aşağıdadır. Her sekme, alfa kanalına sahip bir PNG dosyası olması gereken bir başlık ve simgeden oluşur. Ancak, sekmeler platforma özgü bir şekilde ekranın en altına taşınabilir. Beşten fazla sekme varsa ve sekme listesi ekranın en altındaysa, ek sekmelere erişmek için kullanılabilecek bir Diğer sekmesi görüntülenir. Simge gereksinimleri hakkında daha fazla bilgi için bkz . material.io sekmeleri ve developer.android.com farklı piksel yoğunluklarını destekleme. Sekmeleri ekranın en altına taşıma hakkında bilgi için bkz . TabbedPage Araç Çubuğu Yerleşimi ve Rengi Ayarlama.
Evrensel Windows Platformu (UWP) üzerinde, ekranın en üstünde sekme listesi görüntülenir ve ayrıntılar alanı aşağıdadır. Her sekme bir başlıktır. Ancak, her sekmeye platforma özgü simgeler eklenebilir. Daha fazla bilgi için bkz . Windows'ta TabbedPage Simgeleri.
İpucu
Ölçeklenebilir Vektör Grafiği (SVG) dosyaları üzerinde TabbedPage
sekme simgeleri olarak görüntülenebilir:
- iOS
TabbedRenderer
sınıfı, belirtilen kaynaktan sekme simgelerini yüklemek için kullanılabilecek geçersiz kılınabilirGetIcon
bir yönteme sahiptir. Ayrıca, gerekirse bir simgenin seçili ve seçilmemiş sürümleri sağlanabilir. - Android AppCompat
TabbedPageRenderer
sınıfı, özelDrawable
bir öğesinden sekme simgelerini yüklemek için kullanılabilecek geçersiz kılınabilirSetTabIconImageSource
bir yönteme sahiptir. Alternatif olarak, SVG dosyaları tarafından otomatik olarak görüntülenebilen Xamarin.Formsvektör çizilebilir kaynaklara dönüştürülebilir. SVG dosyalarını vektör çizilebilir kaynaklara dönüştürme hakkında daha fazla bilgi için bkz . developer.android.com üzerinde çok yoğunluklu vektör grafikleri ekleme.
Sekmeli Sayfa Oluşturma
oluşturmak TabbedPage
için iki yaklaşım kullanılabilir:
- öğesini
TabbedPage
, bir nesne koleksiyonu gibi bir altPage
nesne koleksiyonuylaContentPage
doldurun. Daha fazla bilgi için bkz . TabbedPage'i Sayfa Koleksiyonuyla Doldurma. - Özelliğine bir koleksiyon atayın
ItemsSource
ve koleksiyondakiItemTemplate
nesnelerin sayfalarını döndürmek için özelliğine birDataTemplate
atayın. Daha fazla bilgi için bkz . TabbedPage'i şablonla doldurma.
her iki yaklaşımda TabbedPage
da, kullanıcı her sekmeyi seçtiğinde her sayfayı görüntüler.
Önemli
yalnızca ve ContentPage
örnekleriyle NavigationPage
doldurulması önerilirTabbedPage
. Bu, tüm platformlarda tutarlı bir kullanıcı deneyimi sağlamaya yardımcı olur.
Ayrıca, TabbedPage
aşağıdaki özellikleri tanımlar:
BarBackgroundColor
, türündekiColor
sekme çubuğunun arka plan rengidir.BarTextColor
Color
yazın, sekme çubuğundaki metnin rengi.SelectedTabColor
, türüne göreColor
, seçildiğinde sekmenin rengi.UnselectedTabColor
, türüne göreColor
, seçili olmadığında sekmenin rengi.
Bu özelliklerin tümü nesneler tarafından BindableProperty
desteklenir, yani bunlar stillendirilebilir ve özellikler veri bağlamalarının hedefleri olabilir.
Uyarı
içinde TabbedPage
, her Page
nesne oluşturulduğunda oluşturulur TabbedPage
. Bu, özellikle uygulamanın kök sayfasıysa TabbedPage
kötü bir kullanıcı deneyimine yol açabilir. Ancak Shell, Xamarin.Forms gezintiye yanıt olarak bir sekme çubuğu üzerinden erişilen sayfaların isteğe bağlı olarak oluşturulmasını sağlar. Daha fazla bilgi için bkz Xamarin.Forms . Shell.
TabbedPage'i Sayfa koleksiyonuyla doldurma
, TabbedPage
bir nesne koleksiyonu gibi bir alt Page
nesne koleksiyonuyla ContentPage
doldurulabilir. Bu, nesneleri koleksiyona Page
TabbedPage.Children
ekleyerek elde edilir. Bu, XAML'de aşağıdaki gibi gerçekleştirilir:
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TabbedPageWithNavigationPage;assembly=TabbedPageWithNavigationPage"
x:Class="TabbedPageWithNavigationPage.MainPage">
<local:TodayPage />
<NavigationPage Title="Schedule" IconImageSource="schedule.png">
<x:Arguments>
<local:SchedulePage />
</x:Arguments>
</NavigationPage>
</TabbedPage>
Not
Children
sınıfından türetilen TabbedPage
özelliğiMultiPage<T>
, öğesinin ContentProperty
özelliğidirMultiPage<T>
. Bu nedenle, XAML'de nesneleri özelliğine Children
açıkça atamak Page
gerekli değildir.
Eşdeğer C# kodu:
public class MainPageCS : TabbedPage
{
public MainPageCS ()
{
NavigationPage navigationPage = new NavigationPage (new SchedulePageCS ());
navigationPage.IconImageSource = "schedule.png";
navigationPage.Title = "Schedule";
Children.Add (new TodayPageCS ());
Children.Add (navigationPage);
}
}
Bu örnekte , TabbedPage
iki Page
nesneyle doldurulur. İlk alt öğe bir ContentPage
nesne, ikinci alt ise nesne içeren bir ContentPage
nesnedirNavigationPage
.
Aşağıdaki ekran görüntüleri, içindeki bir ContentPage
TabbedPage
nesneyi gösterir:
Başka bir sekme seçildiğinde, sekmeyi ContentPage
temsil eden nesne görüntülenir:
Zamanlama sekmesinde, ContentPage
nesne bir NavigationPage
nesne içinde sarmalanır.
Uyarı
bir NavigationPage
içine yerleştirilebilir TabbedPage
, ancak içine bir TabbedPage
yerleştirilmesi NavigationPage
önerilmez. Bunun nedeni, iOS'ta her UITabBarController
zaman için bir sarmalayıcı işlevi görüyor olmasıdır UINavigationController
. Daha fazla bilgi için bkz . iOS Geliştirici Kitaplığı'nda Birleşik Görünüm Denetleyicisi Arabirimleri .
Sekme içinde gezinme
Gezinti, nesnenin bir nesneye sarmalanması koşuluyla ContentPage
bir NavigationPage
sekme içinde gerçekleştirilebilir. Bu, nesnesinin PushAsync
özelliğinde Navigation
ContentPage
yöntemini çağırarak gerçekleştirilir:
await Navigation.PushAsync (new UpcomingAppointmentsPage ());
Gidilen sayfa, yöntemin bağımsız değişkeni PushAsync
olarak belirtilir. Bu örnekte, UpcomingAppointmentsPage
sayfa gezinti yığınına gönderilir ve burada etkin sayfa olur:
sınıfını NavigationPage
kullanarak gezinti gerçekleştirme hakkında daha fazla bilgi için bkz . Hiyerarşik Gezinti.
TabbedPage'i şablonla doldurma
özelliğine TabbedPage
bir veri ItemsSource
koleksiyonu atanarak ve verileri nesne olarak Page
şablonlayan özelliğine ItemTemplate
bir DataTemplate
atanarak sayfalarla doldurulabilir. Bu, XAML'de aşağıdaki gibi gerçekleştirilir:
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TabbedPageDemo;assembly=TabbedPageDemo"
x:Class="TabbedPageDemo.TabbedPageDemoPage"
ItemsSource="{x:Static local:MonkeyDataModel.All}">
<TabbedPage.Resources>
<ResourceDictionary>
<local:NonNullToBooleanConverter x:Key="booleanConverter" />
</ResourceDictionary>
</TabbedPage.Resources>
<TabbedPage.ItemTemplate>
<DataTemplate>
<ContentPage Title="{Binding Name}" IconImageSource="monkeyicon.png">
<StackLayout Padding="5, 25">
<Label Text="{Binding Name}" Font="Bold,Large" HorizontalOptions="Center" />
<Image Source="{Binding PhotoUrl}" WidthRequest="200" HeightRequest="200" />
<StackLayout Padding="50, 10">
<StackLayout Orientation="Horizontal">
<Label Text="Family:" HorizontalOptions="FillAndExpand" />
<Label Text="{Binding Family}" Font="Bold,Medium" />
</StackLayout>
...
</StackLayout>
</StackLayout>
</ContentPage>
</DataTemplate>
</TabbedPage.ItemTemplate>
</TabbedPage>
Eşdeğer C# kodu:
public class TabbedPageDemoPageCS : TabbedPage
{
public TabbedPageDemoPageCS ()
{
var booleanConverter = new NonNullToBooleanConverter ();
ItemTemplate = new DataTemplate (() =>
{
var nameLabel = new Label
{
FontSize = Device.GetNamedSize (NamedSize.Large, typeof(Label)),
FontAttributes = FontAttributes.Bold,
HorizontalOptions = LayoutOptions.Center
};
nameLabel.SetBinding (Label.TextProperty, "Name");
var image = new Image { WidthRequest = 200, HeightRequest = 200 };
image.SetBinding (Image.SourceProperty, "PhotoUrl");
var familyLabel = new Label
{
FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)),
FontAttributes = FontAttributes.Bold
};
familyLabel.SetBinding (Label.TextProperty, "Family");
...
var contentPage = new ContentPage
{
IconImageSource = "monkeyicon.png",
Content = new StackLayout {
Padding = new Thickness (5, 25),
Children =
{
nameLabel,
image,
new StackLayout
{
Padding = new Thickness (50, 10),
Children =
{
new StackLayout
{
Orientation = StackOrientation.Horizontal,
Children =
{
new Label { Text = "Family:", HorizontalOptions = LayoutOptions.FillAndExpand },
familyLabel
}
},
// ...
}
}
}
}
};
contentPage.SetBinding (TitleProperty, "Name");
return contentPage;
});
ItemsSource = MonkeyDataModel.All;
}
}
Bu örnekte, her sekme, kullanan bir ContentPage
nesneden Image
ve Label
sekmenin verilerini görüntülemek için nesnelerden oluşur:
Başka bir sekme seçildiğinde, sekmeyi ContentPage
temsil eden nesne görüntülenir.