VisualStateManager.GoToState(Control, String, Boolean) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перемещает элемент управления между двумя состояниями, запрашивая новый VisualState по имени.
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
Параметры
- control
- Control
Элемент управления, переводимый из одного состояния в другое.
- stateName
-
String
Platform::String
winrt::hstring
Состояние, в которое требуется перейти.
- useTransitions
-
Boolean
bool
true
для использования VisualTransition для перехода между состояниями.
false
, чтобы пропустить переходы и перейти непосредственно в запрошенное состояние. Значение по умолчанию — false
.
Возвращаемое значение
bool
true
значение , если элемент управления успешно переходит в новое состояние или уже использует это состояние; в противном случае — false
.
Примеры
В этом примере демонстрируется логика управления, использующая метод GoToState для перехода между состояниями.
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);
}
}
<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>
Комментарии
Этот метод используется логикой управления. Обычно он нужен только в том случае, если вы пишете пользовательский элемент управления или используете логику уровня приложения для состояний просмотра (например, при обновлении содержимого приложения для изменения размера окна приложения или ориентации).
При вызове этого метода ожидается visualState со значением x:Name
, которое соответствует вашему stateName
значению, где-то в шаблоне элемента управления, определяемого параметром control
, или в качестве ресурса для приложения. В противном случае исключения не будут возникать, но возвращаемое значение будет равно false
. Состояние с stateName
именем может находиться в любом из элементов VisualStateGroup в шаблоне для указанного элемента управления. Вы можете отслеживать, в каких VisualStateGroup
состояниях они находятся, и знать, какое состояние выгружается при указании нового состояния из этой группы.
Как правило, элемент ControlTemplate , содержащий визуальные состояния, на которые ссылается имя при использовании GoToState
, не определен специально для этого экземпляра элемента управления. Вместо этого визуальные состояния относятся к стилю элемента управления по умолчанию, который загружается в качестве неявного стиля для всех экземпляров этого элемента управления. Дополнительные сведения о концепции неявного стиля см. в разделе Шаблоны элементов управления XAML.
VisualStateManager поддерживает две важные функции для авторов элементов управления и для разработчиков приложений, которые применяют пользовательский шаблон к элементу управления:
- Авторы элементов управления или разработчики приложений добавляют элементы объекта VisualStateGroup в корневой элемент определения шаблона элемента управления в XAML с помощью присоединенного
VisualStateManager.VisualStateGroups
свойства . В элементеVisualStateGroup
каждый элемент VisualState представляет дискретное визуальное состояние элемента управления. У каждого из нихVisualState
есть имя, представляющее состояние пользовательского интерфейса, которое может быть изменено пользователем или с помощью логики элемента управления. СостоитVisualState
в основном из раскадровки. ОнStoryboard
предназначен для отдельных значений свойств зависимостей, которые должны применяться всякий раз, когда элемент управления находится в этом визуальном состоянии. - Управляйте переходом авторов или разработчиков приложений между этими состояниями, вызывая статический метод GoToState в VisualStateManager. Авторы элементов управления делают это всякий раз, когда логика элемента управления обрабатывает события, указывающие на изменение состояния, или логика элемента управления инициирует изменение состояния самостоятельно. Чаще всего это делает код определения элемента управления, а не код приложения, поэтому все возможные визуальные состояния, их переходы и условия триггера имеются по умолчанию для кода приложения. Или это код приложения, который изменяет визуальные состояния для управления состояниями представления на уровне приложения в ответ на управляемые пользователем изменения размера или ориентации окна main приложения.
При вызове GoToState
для изменения визуального состояния элемента управления VisualStateManager выполняет следующие действия:
- Сначала определяется, существует ли соответствующее состояние
stateName
. В противном случае ничего не происходит, и метод возвращаетfalse
. - Если visualState с именем
stateName
существует и имеет раскадровки, раскадровка начинается. - Если объект VisualState , который использовался элементом управления из того же объекта VisualStateGroup до запрошенного состояния, имеет раскадровки, эта раскадровка останавливается. Помимо определенных свойств, к которым новый
VisualState
объект применяет анимацию, элемент управления возвращается к первоначально загруженным состояниям из шаблона элемента управления и его композиции.
Если элемент управления уже находится в visualState , запрошенном как stateName, GoToState
возвращает true
, но в противном случае действие не выполняется (раскадровка не будет перезапущена).
Общий шаблон реализации элемента управления заключается в определении единого закрытого метода класса элемента управления, который отвечает за все возможные изменения VisualState для элемента управления. Используемое визуальное состояние определяется проверкой свойств элемента управления. Эти свойства могут быть общедоступными или частными. Значения свойств корректируются обработчиками в логике управления для таких событий, как OnGotFocus, и проверяются JIT-режим непосредственно перед заданием визуального состояния. В примере кода в этом разделе используется этот шаблон реализации. Кроме того, вы можете вызвать GoToState для отдельных состояний из обработчиков событий, из переопределений обработчиков событий управления (методы On Event) или из вспомогательных методов, которые вызываются всеми возможными импульсами для изменения состояний (события, управляемые пользователем, события автоматизации, логика инициализации).
Вы также можете вызвать GoToState из реализации PropertyChangedCallback для настраиваемого свойства зависимостей.
Визуальные состояния и переходы
Помимо визуальных состояний, модель визуального состояния также включает переходы. Переходы — это действия анимации, управляемые раскадровкой , которые происходят между каждым визуальным состоянием при изменении состояния. Переход можно определить по-разному для каждого сочетания начального и конечного состояний в соответствии с набором визуальных состояний элемента управления. Переходы определяются свойством Transitionsобъекта VisualStateGroup и обычно определяются в XAML. Большинство шаблонов элементов управления по умолчанию не определяют переходы, и в этом случае переходы между состояниями происходят мгновенно. Дополнительные сведения см. в разделе VisualTransition.
Объект VisualTransition также можно определить таким образом, чтобы он порождал неявный переход. Любое свойство зависимостей, специально предназначенное для анимации в визуальных состояниях VisualTransition
From илиTo объекта и которое имеет разные значения при изменении состояния, можно анимировать с помощью анимации неявного перехода. Эта созданная анимация переходит между значением состояния From и значением состояния To такого свойства с помощью интерполяции. Анимация неявного перехода длится в течение времени, указанного значением GeneratedDuration объекта VisualTransition
. Неявные переходы применяются только к свойствам, которые являются значением Double, Color или Point . Иными словами, свойство должно быть возможно для неявной анимации с помощью DoubleAnimation, PointAnimation или ColorAnimation. Дополнительные сведения см. в разделе GeneratedDuration.
События для изменения визуального состояния
CurrentStateChanging срабатывает, когда элемент управления начинает переходить состояния в соответствии с запросом GoToState
вызова . Если к изменению состояния применяется элемент VisualTransition , это событие возникает при начале перехода.
CurrentStateChanged срабатывает после того, как элемент управления перейдет в состояние, запрошенное вызовом GoToState
, так же, как и начало новой раскадровки . При завершении новой раскадровки событие не срабатывает.
Если VisualTransition не применяется, CurrentStateChanging и CurrentStateChanged запускаются в быстрой последовательности, но гарантируются в этом порядке, если они происходят.
Однако если переход на изменение состояния прерывается новым GoToState
вызовом, событие CurrentStateChanged никогда не вызывается для первого перехода состояния. Для следующего запрошенного изменения состояния запускается новый ряд событий.
OnApplyTemplate не вызывается для изменения визуального состояния. OnApplyTemplate вызывается только для начальной загрузки элемента управления в пользовательский интерфейс XAML.
Атрибут именованных визуальных состояний пользовательского элемента управления
Если вы определяете пользовательский элемент управления с визуальными состояниями в xaml-коде шаблона элемента управления, рекомендуется атрибутировать класс элемента управления, чтобы указать потребителям, какие визуальные состояния доступны. Для этого примените один или несколько атрибутов TemplateVisualState на уровне класса кода определения элемента управления. Каждый атрибут должен указывать атрибут состояния x:Name, который является значением stateName , которое потребитель элемента управления будет передавать в GoToState
вызове для использования этого визуального состояния. Если VisualState является частью VisualStateGroup, это также должно быть указано в определении атрибута.
Связанная концепция заключается в том, что авторы элементов управления должны атрибутировать имена ключевых элементов управления с помощью TemplatePartAttribute. Это очень полезно, если потребители элементов управления хотят получить доступ к именованным частям из шаблона область после применения шаблона. TemplateVisualStateAttribute и TemplatePartAttribute помогают определить контракт элемента управления для элемента управления.
Пользовательский VisualStateManager
В качестве расширенного сценария можно наследовать от VisualStateManager и изменить поведение по умолчанию GoToState
. Производный класс должен переопределить защищенный метод GoToStateCore . Любой экземпляр настраиваемого VisualStateManager использует эту логику Core при вызове метода GoToState
.
Визуальные состояния для состояний представления приложения
Визуальные состояния необязательно для пользовательских элементов управления. Вы можете использовать визуальные состояния из новых шаблонов элементов управления, которые применяются к любому экземпляру Элемента управления , в котором вы заменяете шаблон по умолчанию, задав свойство Шаблон . Чтобы настроить эту настройку, необходимо определить шаблон элемента управления и визуальные состояния, которые планируется использовать в качестве ресурса Стиля , который находится в Page.Resources
или Application.Resources
. Всегда лучше начать с копии шаблона по умолчанию и изменить только определенные аспекты шаблона или даже просто изменить некоторые визуальные состояния и оставить базовую композицию в покое. Дополнительные сведения см. в разделе Шаблоны элементов управления XAML.
Визуальные состояния можно использовать для изменения свойств страницы или элементов управления на странице с учетом ориентации окна приложения. Значения свойств, связанных с макетом композиции или макета элемента управления, могут изменяться в зависимости от того, является ли общая ориентация книжной или альбомной. Дополнительные сведения об этом сценарии для GoToState
см. в разделе Адаптивные макеты с помощью XAML.
Визуальные состояния для элементов, которые не являются элементами управления
Визуальные состояния иногда полезны для сценариев, в которых требуется изменить состояние какой-то области пользовательского интерфейса, которая не сразу является подклассом Control . Это невозможно сделать напрямую, так как для параметра GoToState
управления метода требуется Control
подкласс, который ссылается на объект, с которым работает VisualStateManager.
Страница — это Control
подкласс, и вы довольно редко отображаете пользовательский интерфейс в контексте, где у Page
вас нет , или ваш корневой каталог Window.Content не является подклассом Control
. Рекомендуется определить пользовательский элемент UserControl , который будет Window.Content
корнем или контейнером для другого содержимого, к которому вы хотите применить состояния (например , Панель). Затем можно вызвать GoToState
для и UserControl
применить состояния независимо от того, является ли остальное содержимое .Control
Например, можно применить визуальные состояния к пользовательскому интерфейсу, который в противном случае состоит только из SwapChainPanel , если вы разместили его в и UserControl
объявили именованные состояния, которые применяются к свойствам родительского UserControl
элемента или именованной SwapChainPanel
части шаблона.