VisualStateManager.GoToState(Control, String, Boolean) Metode
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.
Transisi kontrol antara dua status, dengan meminta VisualState baru berdasarkan nama.
public:
static bool GoToState(Control ^ control, Platform::String ^ stateName, bool useTransitions);
static bool GoToState(Control const& control, winrt::hstring const& stateName, bool const& useTransitions);
public static bool GoToState(Control control, string stateName, bool useTransitions);
function goToState(control, stateName, useTransitions)
Public Shared Function GoToState (control As Control, stateName As String, useTransitions As Boolean) As Boolean
Parameter
- control
- Control
Kontrol untuk transisi antar status.
- stateName
-
String
Platform::String
winrt::hstring
Status ke transisi.
- useTransitions
-
Boolean
bool
true untuk menggunakan VisualTransition untuk transisi antar status. false untuk melompati menggunakan transisi dan langsung masuk ke status yang diminta. Defaultnya adalah false.
Mengembalikan
bool
true jika kontrol berhasil beralih ke status baru, atau sudah menggunakan status tersebut; jika tidak, salah.
Contoh
Contoh ini menunjukkan logika kontrol yang menggunakan metode GoToState untuk transisi antar status.
private void UpdateStates(bool useTransitions)
{
if (Value >= 0)
{
VisualStateManager.GoToState(this, "Positive", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Negative", useTransitions);
}
if (isFocused)
{
VisualStateManager.GoToState(this, "Focused", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Unfocused", useTransitions);
}
}
Private Sub UpdateStates(ByVal useTransitions As Boolean)
If Value >= 0 Then
VisualStateManager.GoToState(Me, "Positive", useTransitions)
Else
VisualStateManager.GoToState(Me, "Negative", useTransitions)
End If
If isFocused Then
VisualStateManager.GoToState(Me, "Focused", useTransitions)
Else
VisualStateManager.GoToState(Me, "Unfocused", useTransitions)
End If
End Sub
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:NumericUpDownCustomControl"
>
<Style TargetType="local:NumericUpDown">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:NumericUpDown">
<Grid Margin="3"
Background="{TemplateBinding Background}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ValueStates">
<!--Make the Value property red when it is negative.-->
<VisualState x:Name="Negative">
<Storyboard>
<ColorAnimation To="Red"
Storyboard.TargetName="TextBlock"
Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)"/>
</Storyboard>
</VisualState>
<!--Return the control to its initial state by
return the TextBlock Foreground to its
original color.-->
<VisualState x:Name="Positive" />
</VisualStateGroup>
<VisualStateGroup x:Name="FocusStates">
<!--Add a focus rectangle to highlight the entire control
when it has focus.-->
<VisualState x:Name="Focused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusVisual"
Storyboard.TargetProperty="Visibility" Duration="0">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<!--Return the control to its initial state by
hiding the focus rectangle.-->
<VisualState x:Name="Unfocused"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border BorderThickness="1" BorderBrush="Gray"
Margin="7,2,2,2" Grid.RowSpan="2"
Background="#E0FFFFFF"
VerticalAlignment="Center"
HorizontalAlignment="Stretch">
<TextBlock x:Name="TextBlock" TextAlignment="Center" Padding="5"
Foreground="{TemplateBinding Foreground}"/>
</Border>
<RepeatButton Content="Up" Margin="2,5,5,0"
x:Name="UpButton"
Grid.Column="1" Grid.Row="0"
Foreground="Green"/>
<RepeatButton Content="Down" Margin="2,0,5,5"
x:Name="DownButton"
Grid.Column="1" Grid.Row="1"
Foreground="Green"/>
<Rectangle Name="FocusVisual" Grid.ColumnSpan="2" Grid.RowSpan="2"
Stroke="Red" StrokeThickness="1"
Visibility="Collapsed"/>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Keterangan
Metode ini digunakan oleh logika kontrol. Anda biasanya hanya membutuhkannya jika Anda menulis kontrol kustom, atau jika Anda menggunakan logika tingkat aplikasi untuk melihat status (seperti me-refresh konten aplikasi Anda untuk perubahan ukuran atau orientasi jendela aplikasi).
Saat Anda memanggil metode ini, diharapkan ada VisualState dengan nilai x:Name yang cocok dengan nilai stateName Anda, di suatu tempat di templat kontrol untuk kontrol yang diidentifikasi oleh kontrol, atau sebagai sumber daya untuk aplikasi Anda. Jika tidak ada, Anda tidak mendapatkan pengecualian, tetapi nilai yang dikembalikan akan false. Status yang dinamai oleh stateName dapat berada di salah satu elemen VisualStateGroup dalam templat untuk Kontrol yang ditentukan. Terserah Anda untuk melacak status mana yang berada di mana VisualStateGroup dan mengetahui status mana yang akan dibongkar saat Anda menentukan status baru dari grup tersebut.
Biasanya ControlTemplate yang berisi status visual seperti yang dirujuk oleh nama saat menggunakan GoToState tidak didefinisikan secara khusus untuk instans kontrol tersebut. Sebaliknya status visual berasal dari gaya kontrol default yang dimuat sebagai gaya implisit untuk semua instans kontrol tersebut. Untuk informasi selengkapnya tentang konsep gaya implisit, lihat Mulai Cepat: Mengontrol templat.
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 properti terlampir VisualStateManager.VisualStateGroups . Dalam elemen VisualStateGroup , setiap VisualState mewakili status visual kontrol diskrit. Setiap VisualState memiliki nama yang mewakili status UI yang dapat diubah oleh pengguna, atau diubah oleh logika kontrol. VisualState terutama terdiri dari Storyboard. Papan Cerita ini menargetkan nilai properti dependensi individual yang harus diterapkan setiap kali kontrol berada dalam status visual tersebut.
- Mengontrol transisi penulis atau pengembang aplikasi antara status ini dengan memanggil metode GoToState statis 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 serta transisi dan kondisi pemicunya ada secara default untuk kode aplikasi. Atau, ini adalah kode aplikasi yang mengubah status visual, untuk mengelola status tampilan tingkat aplikasi sebagai respons terhadap perubahan berbasis pengguna pada ukuran atau orientasi jendela aplikasi utama.
Saat Anda memanggil GoToState untuk mengubah status visual kontrol, VisualStateManager melakukan tindakan ini:
- Pertama ditentukan apakah status yang cocok dengan stateName ada. Jika tidak, tidak ada yang terjadi dan metode mengembalikan false.
- Jika VisualState seperti yang dinamai oleh stateName ada, dan memiliki Storyboard, papan cerita dimulai.
- Jika VisualState yang digunakan kontrol dari VisualStateGroup yang sama sebelum status yang baru diminta memiliki Storyboard, papan cerita tersebut akan berhenti. Selain properti spesifik tempat VisualState baru menerapkan animasi, kontrol kembali ke status yang awalnya dimuat dari templat kontrol dan komposisinya.
Jika kontrol sudah ada di VisualState yang diminta sebagai stateName, GoToState mengembalikan true, tetapi tidak ada tindakan (papan cerita tidak akan dimulai ulang).
Pola implementasi kontrol umum adalah menentukan satu metode privat dari kelas kontrol yang mengurus semua kemungkinan perubahan VisualState untuk kontrol. Status visual mana yang akan digunakan ditentukan dengan memeriksa properti kontrol. Properti ini mungkin publik atau privat. Nilai properti disesuaikan oleh handler dalam logika kontrol untuk peristiwa seperti OnGotFocus, dan diperiksa tepat waktu segera sebelum mengatur status visual. Contoh kode dalam topik ini menggunakan pola implementasi ini. Atau, Anda dapat memanggil GoToState untuk status individual dari dalam penanganan aktivitas, dari penimpaan penanganan aktivitas kontrol (metode OnEvent ), atau dari metode pembantu yang dipanggil oleh semua kemungkinan dorongan untuk mengubah status (peristiwa berbasis pengguna, peristiwa otomatisasi, logika inisialisasi).
Anda juga dapat memanggil GoToState dari dalam implementasi PropertyChangedCallback untuk properti dependensi kustom.
Status visual dan transisi
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 ditentukan oleh properti TransisiVisualStateGroup dan biasanya ditentukan dalam XAML. Sebagian besar templat kontrol default tidak menentukan transisi, dan dalam hal ini transisi antar status terjadi secara instan. Untuk informasi selengkapnya, lihat VisualTransition.
VisualTransition juga dapat didefinisikan singgh sehingga menghasilkan transisi implisit. Properti dependensi apa pun yang secara khusus ditargetkan untuk animasi baik dalam status VisualTransitionDari atauKe dan memiliki nilai yang berbeda di seluruh perubahan status dapat dianimasikan dengan animasi transisi implisit. Ini menghasilkan transisi animasi antara nilai status Dari dan nilai status Ke dari properti tersebut menggunakan interpolasi. Animasi transisi implisit berlangsung selama waktu yang dinyatakan oleh nilai GeneratedDuration dari VisualTransition. Transisi implisit hanya berlaku untuk properti yang merupakan nilai Ganda, Warna , atau Titik . Dengan kata lain properti harus dimungkinkan untuk menganimasikan secara implisit menggunakan DoubleAnimation, PointAnimation , atau ColorAnimation. Untuk informasi selengkapnya, lihat GeneratedDuration.
Peristiwa untuk perubahan status visual
CurrentStateChanging diaktifkan ketika kontrol mulai melakukan transisi status seperti yang diminta oleh panggilan GoToState. Jika VisualTransition diterapkan ke perubahan status, peristiwa ini terjadi saat transisi dimulai.
CurrentStateChanged diaktifkan setelah kontrol berada dalam status seperti yang diminta oleh panggilan GoToState, sama seperti Storyboard baru dimulai. Tidak ada peristiwa yang diaktifkan pada penyelesaian papan cerita baru.
Jika VisualTransition tidak diterapkan, CurrentStateChanging dan CurrentStateChanged menembak berturut-turut dengan cepat, tetapi dijamin dalam urutan tersebut jika keduanya terjadi.
Namun, jika transisi perubahan status terganggu oleh panggilan GoToState baru, peristiwa CurrentStateChanged tidak pernah dinaikkan untuk transisi status pertama. Seri peristiwa baru diaktifkan untuk perubahan status yang diminta berikutnya.
OnApplyTemplate tidak dipanggil untuk perubahan status visual. OnApplyTemplate hanya dipanggil untuk beban awal kontrol ke UI XAML.
Mengambil status visual bernama kontrol kustom
Jika Anda mendefinisikan kontrol kustom yang memiliki status visual dalam templat kontrolnya XAML, ini adalah praktik terbaik untuk mengaitkan kelas kontrol untuk menunjukkan kepada konsumen mana status visual yang tersedia. Untuk melakukan ini, terapkan satu atau beberapa atribut TemplateVisualState di tingkat kelas kode definisi kontrol Anda. Setiap atribut harus menentukan atribut x:Name status, yang merupakan nilai stateName yang akan diteruskan konsumen kontrol dalam panggilan GoToState untuk menggunakan status visual tersebut. Jika VisualState adalah bagian dari VisualStateGroup, itu juga harus ditunjukkan dalam definisi atribut.
Konsep terkait adalah bahwa penulis kontrol harus mengaitkan nama bagian kontrol kunci menggunakan TemplatePartAttribute. Ini sangat membantu jika konsumen kontrol ingin mengakses bagian bernama dari cakupan templat setelah templat diterapkan. Gabungan TemplateVisualStateAttribute dan TemplatePartAttribute membantu menentukan kontrak kontrol untuk kontrol.
VisualStateManager Kustom
Sebagai skenario lanjutan, dimungkinkan untuk berasal dari VisualStateManager dan mengubah perilaku GoToState default. Kelas turunan harus mengambil alih metode GoToStateCore yang dilindungi. Setiap instans VisualStateManager kustom menggunakan logika Core ini ketika metode GoToState-nya dipanggil.
Status visual untuk status tampilan aplikasi
Status visual belum tentu untuk kontrol kustom. Anda dapat menggunakan status visual dari templat kontrol baru yang Anda terapkan ke instans Kontrol mana pun tempat Anda mengganti templat default dengan mengatur properti Templat . Untuk menyiapkan ini, Anda harus menentukan templat kontrol dan status visual yang Anda rencanakan untuk digunakan sebagai sumber daya Gaya yang ada di atau Page.Resources
Application.Resources
. Yang terbaik adalah memulai dengan salinan templat default dan hanya memodifikasi aspek-aspek tertentu dari templat atau bahkan hanya memodifikasi beberapa status visual dan membiarkan komposisi dasar saja. Untuk informasi selengkapnya, lihat Mulai Cepat: Mengontrol templat.
Status visual dapat digunakan untuk mengubah properti Halaman atau kontrol dalam halaman untuk memperkirakan orientasi jendela aplikasi. Komposisi Anda atau nilai properti terkait tata letak kontrol Anda mungkin berubah tergantung pada apakah orientasi keseluruhan adalah potret atau lanskap. Untuk informasi selengkapnya tentang skenario ini untuk GoToState, lihat Mulai Cepat: Mendesain aplikasi untuk ukuran jendela yang berbeda.
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 subkelas Kontrol , yang mengacu pada objek yang ditindak lanjuti VisualStateManager . Halaman adalah subkelas Kontrol , dan cukup jarang Anda menampilkan UI dalam konteks di mana Anda tidak memiliki Halaman, atau akar Window.Content Anda bukan subkelas Kontrol . Kami sarankan Anda menentukan UserControl kustom untuk menjadi root Window.Content atau menjadi kontainer untuk konten lain yang ingin Anda terapkan statusnya (seperti Panel). Kemudian Anda dapat memanggil GoToState di UserControl Anda dan menerapkan status terlepas dari apakah konten lainnya adalah Kontrol. Misalnya Anda dapat menerapkan status visual ke UI yang hanya terdiri dari SwapChainPanel selama Anda menempatkannya dalam UserControl Anda dan dinyatakan bernama status yang berlaku untuk properti UserControl induk atau bagian SwapChainPanel bernama dari templat.