Maui: [Spesifikasi] TabView

Dibuat pada 18 Jun 2020  ·  12Komentar  ·  Sumber: dotnet/maui

Tampilan Tab

Kita dapat memiliki tab menggunakan Shell. Namun, apa yang terjadi jika kita ingin memiliki tab bersarang dalam bagian tertentu (Contoh: Grid)?, _bagaimana jika kita ingin menyesuaikan setiap tab secara penuh?_. Dalam kasus ini, sejauh ini kita membutuhkan Renderer Kustom...

TabView adalah cara untuk menampilkan sekumpulan tab dan kontennya masing-masing. TabView berguna untuk menampilkan beberapa konten sambil memberi pengguna kemampuan untuk menyesuaikan sebagian besar semuanya.

tabview

CATATAN: TabView adalah tampilan lintas platform yang mengambil alih ketika tab asli mencapai batasnya, seperti pemosisian dengan tata letak, gaya, dan gaya yang tidak seragam seperti tombol yang dinaikkan.

API

Selanjutnya, daftar dengan properti TabView, peristiwa, dan status visual.

Properti

Properti Tampilan Tab

| Properti | Ketik | Deskripsi |
|----------|:-------------:|:-------------:|
| TabItemsSumber | IE dapat dihitung | Koleksi yang digunakan untuk menghasilkan item tab TabView. |
| TabViewItemDataTemplate | DataTemplat | template yang digunakan Tampilan Tab untuk menghasilkan tajuk item tab. |
| TabContentDataTemplate | DataTemplat | Kerangka yang digunakan Tampilan Tab untuk menghasilkan konten item tab. |
| IsCyclical | Bool | Mengaktifkan atau menonaktifkan navigasi tab siklus. |
| Malas | Bool | Mengaktifkan atau menonaktifkan pemuatan tab malas. |
| Indeks Terpilih | Int | Mendapatkan atau menyetel tab yang saat ini dipilih. Standarnya adalah 0. |
| TabStripPenempatan | TabStripPenempatan | Penempatan TabStrip (atas atau bawah). |
| TabStripLatar Belakang | Kuas | Latar belakang TabStrip. |
| TabIndikatorKuas | Kuas | Latar belakang TabIndikator. |
| TabIndikatorTinggi | ganda | Tinggi TabIndikator. |
| TabIndikatorLebar | ganda | Lebar TabIndikator. |
| TabIndikatorPenempatan | TabIndikatorPenempatan | |
| TabIndikatorTampilan | Lihat | Konten TabIndikator. |
| TabKontenLatar Belakang | Kuas | Latar belakang konten tab. |
| TabContentHeight | Ganda | Tinggi konten tab. |
| TabStripHeight | Ganda | Tinggi TabStrip. |
| TabContentHeight | Ganda | Tinggi konten tab. |
| HasTabStripShadow | Bool | Menampilkan atau menyembunyikan efek bayangan TabStrip. |
| IsTabTransitionEnabled | Bool | Mengaktifkan atau menonaktifkan transisi antar tab. |
| IsSwipeEnabled | Bool | Mengaktifkan atau menonaktifkan gerakan menggesek. |

Properti TabViewItem

| Properti | Ketik | Deskripsi |
|----------|:-------------:|:-------------:|
| Teks | String | Teks tab. |
| Warna Teks | Warna | Warna teks tab. |
| WarnaTeksDipilih | Warna | Warna teks dari tab yang dipilih. |
| Ukuran Font | Ukuran Font | Ukuran font yang digunakan dalam teks tab. |
| Ukuran Font Dipilih | Ukuran Font | Ukuran font yang digunakan di tab yang dipilih. |
| Keluarga Font | String | Keluarga font yang digunakan di tab. |
| FontFamilyDipilih | String | Keluarga font yang digunakan di tab yang dipilih. |
| FontAttributes | FontAttributes | Atribut font yang digunakan di tab. |
| FontAttributesDipilih | FontAttributes | Atribut font yang digunakan di tab yang dipilih. |
| Ikon | Sumber Gambar | Ikon tab. |
| IkonDipilih | Sumber Gambar | ImageSource digunakan sebagai ikon di tab yang dipilih. |
| Konten | Lihat | Isi tabnya. Adalah View, dapat menggunakan apa saja sebagai konten. |
| Teks Lencana | Bool | Teks lencana yang digunakan di tab. |
| LencanaTeksWarna | Warna | Warna teks lencana yang digunakan di tab. |
| BadgeTextColorSelected | Warna | Warna teks lencana yang digunakan di tab yang dipilih. |
| LencanaLatar BelakangWarna | Warna | Warna lencana yang digunakan di tab. |
| BadgeBackgroundColorSelected | Warna | Warna lencana yang digunakan di tab yang dipilih. |
| Dipilih | Bool | sebuah bool yang menunjukkan jika tab dipilih atau tidak. |
| Ketuk Perintah | ICommand | Perintah yang dijalankan saat pengguna mengetuk tab. |
| KetukCommandParameter | objek | Parameter perintah ketuk. |

Acara

TabView Acara

| Acara | Deskripsi |
|----------|:-------------:|
| PilihanDiubah | Event yang dimunculkan ketika tab yang dipilih berubah. |
| Digulir | Acara yang dimunculkan saat menggesek antar tab. |

Acara TabViewItem

| Acara | Deskripsi |
|----------|:-------------:|
| TabKetuk | Event yang dimunculkan saat pengguna tap tab. |

keadaan visual

Visual State Manager (VSM) menyediakan cara terstruktur untuk membuat perubahan visual pada antarmuka pengguna dari kode.
VSM memperkenalkan konsep status visual. TabView dapat memiliki beberapa tampilan visual yang berbeda tergantung pada keadaan dasarnya.

TabView memiliki empat VisualStates tertentu:

  • StatusTabVisual Saat Ini
  • BerikutnyaTabVisualState
  • SebelumnyaTabVisualState
  • DefaultTabVisualState

Skenario

Mari kita lihat beberapa contoh yang mencakup skenario umum.

Tab Dasar

Mari kita lihat contoh dasarnya:

<TabView 
    TabStripPlacement="Bottom"
    TabStripBackgroundColor="Blue">
    <TabViewItem
        Icon="triangle.png"
        Text="Tab 1">
        <Grid 
            BackgroundColor="Gray">
            <Label
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Text="TabContent1" />
        </Grid>
    </TabViewItem>
    <TabViewItem
        Icon="circle.png"
        Text="Tab 2">
        <Grid>
            <Label    
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Text="TabContent2" />
        </Grid>
    </TabViewItem>
</TabView>

basic-tabs

TabItemSumber

Menggunakan TabItemsSource (tab dinamis):

<TabView
    TabItemsSource="{Binding Monkeys}"
    TabViewItemDataTemplate="{StaticResource TabViewItemTemplate}"
    TabContentDataTemplate="{StaticResource TabContentTemplate}" />

tabitemssource

Tab Khusus

Tampilan setiap tab dapat disesuaikan:

<ControlTemplate
    x:Key="TabItemTemplate">
    <Grid>
    ...
    </Grid>
</ControlTemplate>

<TabView>
    <TabViewItem
        Text="Tab 1"
        ControlTemplate="{StaticResource TabItemTemplate}">
    </TabViewItem>
</TabView>

custom-tabs

Tab Siklus

Apakah Anda ingin bernavigasi di antara tab secara siklis?

<TabView
    IsCyclical="True">
    ...
</TabView>

iscyclical

Pemuatan Malas

Pemuatan tab malas:

<TabView
    IsLazy="True">
    ...
</TabView>

lazy-tabs

Transisi Tab dan animasi TabViewItem

Dapat menggunakan animasi Xamarin.Forms untuk menyesuaikan transisi antar setiap tab, menganimasikan tab saat muncul atau menghilang, atau bahkan menganimasikan lencana saat muncul atau menghilang.

<TabView>
    <TabView.TabTransition>
        <local:CustomTabTransition />
    </TabView.TabTransition>
    <TabViewItem
        Text="Tab 1">      
            <TabViewItem.TabAnimation>
                <local:CustomTabViewItemAnimation />
            </TabViewItem.TabAnimation>
        <Grid 
            BackgroundColor="LawnGreen">
            <Label
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Text="TabContent1" />
        </Grid>
    </TabViewItem>
    ...
</TabView>

custom-tabs-animation

Menggunakan VisualStates

Dapat menggunakan status visual yang berbeda untuk menyesuaikan tab saat ini, tab berikutnya, dll.

<Grid>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="TabViewStates">
            <VisualState x:Name="CurrentTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="1" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="PreviousTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="0.7" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="NextTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="0.7" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="DefaultTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="0.9" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Label Text="{Binding Index}" HorizontalOptions="Center" VerticalOptions="End" />
</Grid>

Buat Tab menggunakan C

Anda dapat menggunakan XAML atau C# untuk membuat UI di Xamarin.Forms. Mari kita lihat bagaimana kita akan membuat tab menggunakan C#.

var tabView = new Tabs
{
    TabStripPlacement = TabStripPlacement.Bottom,
    TabStripBackgroundColor = Color.Blue,
    TabStripHeight = 60,
    TabIndicatorColor = Color.Yellow,
    TabContentBackgroundColor = Color.Yellow
};

var tabViewItem1 = new TabViewItem
{
    Icon = "triangle.png",
    Text = "Tab 1",
    TextColor = Color.White,
    TextColorSelected = Color.Yellow,
};

var tabViewItem1Content = new Grid
{
    BackgroundColor = Color.Gray
};

var label1 = new Label
{
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center,
    Text = "TabContent1"
};

tabViewItem1Content.Children.Add(label1);

tabViewItem1.Content = tabViewItem1Content;

tabView.TabItems.Add(tabViewItem1);

var tabViewItem2 = new TabViewItem
{
    Icon = "circle.png",
    Text = "Tab 2",
    TextColor = Color.White,
    TextColorSelected = Color.Yellow
};

var tabViewItem2Content = new Grid
{
    BackgroundColor = Color.OrangeRed
};

var label2 = new Label
{
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center,
    Text = "TabContent2"
};

tabViewItem2Content.Children.Add(label2);

tabViewItem2.Content = tabViewItem2Content;

tabView.TabItems.Add(tabViewItem2);

Menggunakan Gaya

Dapat menyesuaikan tampilan konten tab, strip tab, item tab, dll. menggunakan gaya XAML atau CSS .

Menggunakan XAML:

<Style
    x:Key="TabItemStyle"
    TargetType="TabViewItem">
    <Setter
        Property="FontSize"
        Value="12" />
    <Setter
        Property="TextColor"
        Value="#979797" />
</Style>

Menggunakan CSS:

.customTabItem {
    font-size: medium;
    text-color: red;
}

Kesulitan: Sedang

Informasi lebih lanjut

Berdasarkan https://github.com/xamarin/Xamarin.Forms/issues/10773

proposal-open

Komentar yang paling membantu

@irongut , Terima kasih atas catatannya. Saya pikir itu juga desain yang salah. Seharusnya tidak ada sesuatu seperti BadgeText.

Jika kami memikirkan kerangka kerja yang dapat memenuhi persyaratan di masa mendatang, kami tidak boleh membatasi pengembang dengan tipe seperti String atau ImageSource. Jika demikian maka kita akan segera mendapatkan masalah seperti ini: Membuat Sudut Lencana Bulat, Membuat Lencana Lebih Besar, Lebih Kecil, Bayangan, Kiri ke Ikon, Atas, Bawah, Kanan, di depan ikon, di belakang ikon, Animasi ... dll. Dan orang-orang akan merasa frustrasi karena mereka tidak dapat menyesuaikannya dengan mudah. Menulis ini, saya sedang membuat lencana pemberitahuan yang akan berputar di sekitar sumbu X dua kali sebelum mengendap. lihat betapa anehnya penyesuaian itu?

Semua 12 komentar

Bisakah kita melihat sampel C# di MVU?

Akan sangat membantu untuk beberapa skenario penggunaan (misalnya milik saya) jika perilaku TabView diperpanjang sehingga, jika tampilan cukup lebar, tab akan 'membuka', artinya, mereka akan menampilkan konten semua tab di seluruh layar. Ini memungkinkan 'desain responsif' rapi yang bekerja sangat baik dengan tablet.

Pada ponsel, atau tablet yang dipegang dalam mode potret, pengguna melihat tampilan tab dengan satu panel ditampilkan di layar, dan panel lainnya dapat dijangkau melalui gerakan 'ganti tab'; tetapi ketika tablet diputar ke mode lanskap (atau jika pada mesin desktop dengan layar yang cukup lebar), layar menampilkan semua panel secara bersamaan, bersebelahan, melintasi layar.

Ikon bertipe View, bukan ImageSource. Kami ingin menampilkan notifikasi (biasanya sebagai titik kecil di pojok atas ikon tab)

Ikon bertipe View, bukan ImageSource. Kami ingin menampilkan notifikasi (biasanya sebagai titik kecil di pojok atas ikon tab)

@MhAllan Saya percaya itu akan dicapai dengan menggunakan properti TabViewItem BadgeText, BadgeTextColor, BadgeTextColorSelected, BadgeBackgroundColor & BadgeBackgroundColorSelected.

Saya perhatikan BadgeText tampaknya memiliki tipe yang salah terdaftar, saya yakin itu seharusnya String, bukan Bool.

@irongut , Terima kasih atas catatannya. Saya pikir itu juga desain yang salah. Seharusnya tidak ada sesuatu seperti BadgeText.

Jika kami memikirkan kerangka kerja yang dapat memenuhi persyaratan di masa mendatang, kami tidak boleh membatasi pengembang dengan tipe seperti String atau ImageSource. Jika demikian maka kita akan segera mendapatkan masalah seperti ini: Membuat Sudut Lencana Bulat, Membuat Lencana Lebih Besar, Lebih Kecil, Bayangan, Kiri ke Ikon, Atas, Bawah, Kanan, di depan ikon, di belakang ikon, Animasi ... dll. Dan orang-orang akan merasa frustrasi karena mereka tidak dapat menyesuaikannya dengan mudah. Menulis ini, saya sedang membuat lencana pemberitahuan yang akan berputar di sekitar sumbu X dua kali sebelum mengendap. lihat betapa anehnya penyesuaian itu?

SfTabview @MhAllan Syncfusion adalah contoh yang baik bagaimana hal itu dapat dilakukan lebih dinamis.

Terima kasih, tetapi siapa yang ingin melihat karya lintah yang dijual seharga ribuan dolar ketika sistem operasi, bahasa pemrograman, dan kerangka kerja yang luar biasa gratis.

Saya tidak bermaksud menggunakan Syncfusion. itu hanya untuk mengatakan bahwa itu adalah contoh yang baik untuk melihat dan menginspirasi bagaimana mereka melakukannya. Selain itu mereka menawarkan gratis untuk pelanggan individu hanya dibayar untuk perusahaan besar lebih dari 1m pendapatan. Percayalah mereka 1-2 langkah di depan Xamarin itu sendiri. kami bahkan tidak bisa mendapatkan Collection/ListView yang tepat di sini selama berbulan-bulan, selama bertahun-tahun.

Saya setuju bahwa TabViewItem secara keseluruhan harus lebih atau kurang hanya memiliki ContentView di mana kita dapat menempatkan tampilan apa pun yang kita inginkan di dalam item tab. Saat melakukannya, membatasi kami untuk menerapkan tampilan tab dengan cara yang Anda bayangkan, bukan seperti yang kami inginkan. Jika Anda menginginkan tampilan tab "mudah digunakan" yang memiliki tampilan default, Anda cukup membuat kelas SimpleTabItemView , yang dapat digunakan orang sebagai tampilan untuk item tab mereka, sambil mengizinkan kami untuk mengimplementasikan tampilan dan nuansa sendiri melalui tampilan kustom kita sendiri.

Saya setuju bahwa TabViewItem secara keseluruhan harus lebih atau kurang hanya memiliki ContentView di mana kita dapat menempatkan tampilan apa pun yang kita inginkan di dalam item tab. Saat melakukannya, membatasi kami untuk menerapkan tampilan tab dengan cara yang Anda bayangkan, bukan seperti yang kami inginkan. Jika Anda menginginkan tampilan tab "mudah digunakan" yang memiliki tampilan default, Anda cukup membuat kelas SimpleTabItemView , yang dapat digunakan orang sebagai tampilan untuk item tab mereka, sambil mengizinkan kami untuk mengimplementasikan tampilan dan nuansa sendiri melalui tampilan kustom kita sendiri.

Saya pikir itu baik untuk memiliki beberapa batasan untuk operasi yang stabil

Saya pikir itu baik untuk memiliki beberapa batasan untuk operasi yang stabil

Anda masih dapat memiliki tampilan tab default untuk "operasi stabil" yang mudah digunakan. Tidak ada alasan untuk membatasi seluruh tampilan.

Ini pindah ke Xamarin Community Toolkit untuk saat ini

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

mhrastegary77 picture mhrastegary77  ·  3Komentar

Suplanus picture Suplanus  ·  4Komentar

Joshua-Ashton picture Joshua-Ashton  ·  9Komentar

jsuarezruiz picture jsuarezruiz  ·  6Komentar

aspnetde picture aspnetde  ·  50Komentar