VisualStateManager Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mengelola status visual dan logika untuk transisi antara status visual untuk kontrol. Juga menyediakan dukungan properti terlampir untuk VisualStateManager.VisualStateGroups, yaitu cara Anda menentukan status visual di XAML untuk templat kontrol.
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class VisualStateManager : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class VisualStateManager : DependencyObject
Public Class VisualStateManager
Inherits DependencyObject
- Warisan
- Atribut
Contoh
Contoh ini menunjukkan cara menggunakan VisualStateManager.VisualStateGroups properti terlampir XAML. Perhatikan bagaimana tidak ada tag "VisualStateManager" yang ditentukan. Secara konseptual, VisualStateManager.VisualStateGroups berisi status visual untuk kontrol, sebagai tag turunan langsung dari akar templat dalam templat kontrol.
Kumpulan status visual tertentu berisi satu VisualStateGroup, yang disebut "CommonStates", yang menentukan objek VisualState "PointerOver" dan "Normal". Saat pengguna meletakkan penunjuk di atas Tombol, Kisi berubah dari hijau menjadi merah dalam .5 detik. Ketika pengguna memindahkan penunjuk menjauh dari tombol, Kisi segera berubah kembali menjadi hijau.
<ControlTemplate TargetType="Button">
<Grid >
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<!--Take one half second to transition to the PointerOver state.-->
<VisualTransition To="PointerOver"
GeneratedDuration="0:0:0.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<!--Change the SolidColorBrush, ButtonBrush, to red when the
Pointer is over the button.-->
<VisualState x:Name="PointerOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="ButtonBrush"
Storyboard.TargetProperty="Color" To="Red" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid.Background>
<SolidColorBrush x:Name="ButtonBrush" Color="Green"/>
</Grid.Background>
</Grid>
</ControlTemplate>
<common:LayoutAwarePage>
<Grid>
...
<VisualStateManager.VisualStateGroups>
<!-- Visual states reflect the application's window size -->
<VisualStateGroup>
<VisualState x:Name="DefaultLayout">
<Storyboard>
</Storyboard>
</VisualState>
<VisualState x:Name="Below768Layout">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)"
Storyboard.TargetName="ContentRoot">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Thickness>20,20,20,20</Thickness>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.HorizontalAlignment)"
Storyboard.TargetName="FooterPanel">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<HorizontalAlignment>Left</HorizontalAlignment>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</common:LayoutAwarePage>
Cuplikan berikutnya adalah kode untuk digunakan bersama dengan XAML, memperlihatkan bagaimana aplikasi mungkin mendeteksi lebar jendela aplikasi dan menggunakan info tersebut untuk memanggil status visual yang sesuai.
String state = (Window.Current.Bounds.Width > 768) ? "DefaultLayout" : "Below768Layout";
VisualStateManager.GoToState(this, state, false); // 'this' is the LayoutAwarePage, scope is page code-behind
Keterangan
VisualStateManager mendukung dua fitur penting untuk penulis kontrol, dan untuk pengembang aplikasi yang menerapkan templat kustom ke kontrol:
- Penulis kontrol atau pengembang aplikasi menambahkan elemen objek VisualStateGroup ke elemen akar definisi templat kontrol di XAML, menggunakan
VisualStateManager.VisualStateGroupsproperti terlampir.VisualStateGroupDalam elemen, setiap VisualState mewakili status visual kontrol diskrit. Masing-masingVisualStatememiliki nama yang mewakili status UI yang dapat diubah oleh pengguna, atau diubah oleh logika kontrol. AVisualStateterutama terdiri dari Storyboard. IniStoryboardmenargetkan perubahan nilai properti dependensi individual yang harus diterapkan setiap kali kontrol berada dalam status visual tersebut. - Kontrol transisi penulis atau pengembang aplikasi antara status ini dengan memanggil metode GoToState statis dari
VisualStateManager. Penulis kontrol melakukan ini setiap kali logika kontrol menangani peristiwa yang menunjukkan perubahan status, atau logika kontrol memulai perubahan status dengan sendirinya. Lebih umum bagi kode definisi kontrol untuk melakukan ini daripada kode aplikasi, sehingga semua status visual yang mungkin dan transisi dan kondisi pemicunya ada secara default untuk kode aplikasi, dan logika dienkapsulasi oleh kontrol.
Sebagian besar pengembang hanya akan menggunakan dua VisualStateManager API: VisualStateManager.VisualStateGroups, dan GoToState, seperti yang dijelaskan di atas. API yang tersisa semuanya untuk dukungan ekstensi dan membuat kustom VisualStateManager. Untuk informasi selengkapnya, lihat bagian "VisualStateManager Kustom" dalam topik ini.
Saat Anda mengedit salinan gaya seperti yang diaktifkan oleh permukaan desain XAML Microsoft Visual Studio, status visual dari templat default ditentukan dalam XAML yang Anda edit. Pastikan Anda tidak menghapus status ini atau mengubah namanya, karena logika kontrol mengharapkan bahwa status visual ini ada di templat.
Selain status visual, model status visual juga mencakup transisi. Transisi adalah tindakan animasi yang dikontrol oleh Papan Cerita yang terjadi di antara setiap status visual saat status diubah. Transisi dapat didefinisikan secara berbeda untuk setiap kombinasi status awal dan status akhir seperti yang didefinisikan oleh kumpulan status visual kontrol Anda. Transisi didefinisikan oleh properti Transisi dari VisualStateGroup, dalam XAML menggunakan sintaks elemen properti. Sebagian besar templat kontrol default tidak menentukan transisi. Dengan tidak adanya transisi yang ditentukan secara khusus, transisi antar status terjadi secara instan (nol-durasi). Untuk informasi selengkapnya, lihat VisualTransition.
VisualStateManager Kustom
Jika Anda ingin menerapkan logika Anda sendiri untuk transisi antar status (skenario tingkat lanjut), Anda dapat membuat kelas yang mewarisi dari VisualStateManager. Ikuti panduan berikut:
- Kelas turunan harus mengambil alih metode GoToStateCore yang dilindungi. Setiap instans kustom
VisualStateManagermenggunakan logika Core ini ketika metode GoToState-nya dipanggil. - Untuk mereferensikan kelas kustom
VisualStateManagerAnda, atur nilaiVisualStateManager.CustomVisualStateManagerproperti terlampir pada elemen akar ControlTemplate tempat Anda ingin menggunakan perilaku kelas kustomVisualStateManager, bersamaVisualStateManager.VisualStateGroupsdengan penggunaan properti terlampir yang menentukan status visual untuk templat. Anda biasanya membuat instans kelas kustomVisualStateManagermelalui konstruksi XAML default di Application.Resources.VisualStateManager.CustomVisualStateManagerKemudian properti terlampir diatur menggunakan referensi ekstensi markup {StaticResource} ke kunci sumber daya kustomVisualStateManager.
Itulah persyaratan dasar untuk membuat dan menggunakan kustom VisualStateManager. Anda juga dapat memilih untuk mengambil alih beberapa perilaku lagi:
- Ambil alih RaiseCurrentStateChanged untuk mengontrol kapan peristiwa CurrentStateChanged diaktifkan oleh VisualStateGroup yang dikelola oleh
VisualStateManager. - Ambil alih RaiseCurrentStateChanging untuk mengontrol kapan peristiwa CurrentStateChanging diaktifkan oleh VisualStateGroup yang dikelola oleh
VisualStateManager. - Mengambil alih atau membebani konstruktor jika kelas kustom Anda memerlukan informasi tambahan untuk diinisialisasi.
Semua API lainnya (CustomVisualStateManagerProperty, GetCustomVisualStateManager, GetVisualStateGroups, SetCustomVisualStateManager) adalah infrastruktur untuk dukungan properti terlampir, dan Anda tidak perlu memanggilnya atau melakukan apa pun dengannya.
Status visual untuk elemen yang bukan kontrol
Status visual terkadang berguna untuk skenario di mana Anda ingin mengubah status beberapa area UI yang tidak segera menjadi subkelas Kontrol . Anda tidak dapat melakukan ini secara langsung karena parameter kontrol metode GoToState memerlukan Control subkelas, yang mengacu pada objek yang ditindak lanjuti VisualStateManager.
Halaman adalah Control subkelas, dan cukup jarang Anda akan menampilkan UI dalam konteks di mana Anda tidak memiliki Page, atau akar Window.Content Anda bukan Control subkelas. Kami sarankan Anda menentukan UserControl kustom untuk menjadi Window.Content root atau menjadi kontainer untuk konten lain yang ingin Anda terapkan statusnya (seperti Panel). Kemudian Anda dapat memanggil GoToState di status Anda UserControl dan menerapkan terlepas dari apakah konten lainnya adalah Control. Misalnya Anda dapat menerapkan status visual ke UI yang hanya terdiri dari SwapChainPanel selama Anda menempatkannya di dalam status bernama anda UserControl dan dideklarasikan yang berlaku untuk properti induk UserControl atau bagian bernama SwapChainPanel dari templat.
Properti terlampir XAML
VisualStateManager adalah kelas layanan host untuk beberapa properti terlampir XAML.
Untuk mendukung akses prosesor XAML ke properti terlampir, dan juga untuk mengekspos operasi get dan setara ke kode, setiap properti terpasang XAML memiliki sepasang Get metode aksesor dan Set . Cara lain untuk mendapatkan atau mengatur nilai dalam kode adalah dengan menggunakan sistem properti dependensi, memanggil GetValue atau SetValue dan meneruskan bidang pengidentifikasi sebagai pengidentifikasi properti dependensi.
| Properti Terlampir | Deskripsi |
|---|---|
| VisualStateGroups | Mendapatkan kumpulan elemen VisualStateGroup yang ditentukan oleh elemen akar definisi templat. Kontrol biasanya mendefinisikan ini sebagai bagian dari templatnya.
Saat mendapatkan properti ini dalam kode, gunakan GetVisualStateGroups. Ini mengembalikan objek koleksi, yang dapat Anda tambahkan itemnya. Ini paralel dengan perilaku pemrosesan XAML dari elemen turunan apa pun dari penggunaan elemen properti VisualStateManager.VisualStateGroups. Karena tidak ada pengidentifikasi properti dependensi publik untuk properti terlampir khusus ini, Anda tidak dapat menggunakan GetValue untuk mendapatkan nilai properti terlampir ini, Anda selalu harus menggunakan GetVisualStateGroups. |
| CustomVisualStateManager | Mendapatkan atau mengatur objek VisualStateManager kustom yang menangani transisi antara status kontrol.
Properti terlampir ini hanya diperlukan untuk kasus di mana Anda ingin menggunakan kelas implementasi kustom untuk menangani perubahan status visual aplikasi Anda, bukan kelas VisualStateManager default yang diterapkan oleh Windows Runtime. Jika Anda tidak berniat menggunakan implementasi kustom, Anda tidak perlu mengatur properti ini. |
Konstruktor
| Nama | Deskripsi |
|---|---|
| VisualStateManager() |
Menginisialisasi instans baru kelas VisualStateManager . |
Properti
| Nama | Deskripsi |
|---|---|
| CustomVisualStateManagerProperty |
Mengidentifikasi properti dependensi VisualStateManager.CustomVisualStateManager . |
| Dispatcher |
Selalu kembali |
| DispatcherQueue |
|
Properti yang Terlampir
| Nama | Deskripsi |
|---|---|
| CustomVisualStateManager |
Mendapatkan atau mengatur objek VisualStateManager kustom yang menangani transisi antara status kontrol. |