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.

Возвращаемое значение

Boolean

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);
    }

}
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>

Комментарии

Этот метод используется логикой управления. Обычно он нужен только в том случае, если вы пишете пользовательский элемент управления или используете логику уровня приложения для состояний просмотра (например, при обновлении содержимого приложения для изменения размера окна приложения или ориентации).

При вызове этого метода ожидается, что visualState со значением x:Name будет соответствовать вашему значению stateName , где-то в шаблоне элемента управления, определяемого элементом управления, или в качестве ресурса для приложения. В противном случае исключения не будут возникать, но возвращаемое значение будет false. Состояние с именем stateName может находиться в любом из элементов VisualStateGroup в шаблоне для указанного элемента управления. Вы можете отслеживать, в каких состояниях находится VisualStateGroup , и знать, какое состояние будет выгружено при указании нового состояния из этой группы.

Как правило, элемент ControlTemplate , содержащий визуальные состояния, на которые ссылается имя при использовании GoToState, не определен специально для этого экземпляра элемента управления. Вместо этого визуальные состояния относятся к стилю элемента управления по умолчанию, который загружается в качестве неявного стиля для всех экземпляров этого элемента управления. Дополнительные сведения о концепции неявного стиля см. в разделе Краткое руководство. Шаблоны элементов управления.

VisualStateManager поддерживает две важные функции для авторов элементов управления и для разработчиков приложений, которые применяют пользовательский шаблон к элементу управления:

  • Авторы элементов управления или разработчики приложений добавляют элементы объекта VisualStateGroup в корневой элемент определения шаблона элемента управления в XAML с помощью присоединенного свойства VisualStateManager.VisualStateGroups . В элементе VisualStateGroup каждый элемент VisualState представляет дискретное визуальное состояние элемента управления. У каждого visualState есть имя, представляющее состояние пользовательского интерфейса, которое может быть изменено пользователем или логикой управления. VisualState состоит в основном из раскадровки. Эта раскадровка предназначена для отдельных значений свойств зависимостей, которые должны применяться всякий раз, когда элемент управления находится в этом визуальном состоянии.
  • Управляйте переходом авторов или разработчиков приложений между этими состояниями, вызывая статический метод 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 также можно определить таким образом, чтобы он порождал неявный переход. Любое свойство зависимостей, которое специально предназначено для анимации в визуальных состояниях From илиToобъекта VisualTransition и имеет разные значения в изменении состояния, можно анимировать с помощью анимации неявного перехода. Эта созданная анимация переходит между значением состояния 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. Всегда лучше начать с копии шаблона по умолчанию и изменить только определенные аспекты шаблона или даже просто изменить некоторые визуальные состояния и оставить базовую композицию в покое. Подробнее см. в разделе Краткое руководство: шаблоны элементов управления.

Визуальные состояния можно использовать для изменения свойств страницы или элементов управления на странице с учетом ориентации окна приложения. Значения свойств, связанных с макетом композиции или макета элемента управления, могут изменяться в зависимости от того, является ли общая ориентация книжной или альбомной. Дополнительные сведения об этом сценарии для GoToState см. в статье Краткое руководство. Проектирование приложений для различных размеров окон.

Визуальные состояния для элементов, которые не являются элементами управления

Визуальные состояния иногда полезны для сценариев, в которых требуется изменить состояние какой-то области пользовательского интерфейса, которая не сразу является подклассом Control . Это невозможно сделать напрямую, так как для параметра control метода GoToState требуется подкласс Control , который ссылается на объект, с которым работает VisualStateManager . Page — это подкласс Control , и вы довольно редко отображаете пользовательский интерфейс в контексте, где у вас нет страницы или корневой каталог Window.Content не является подклассом Control . Рекомендуется определить настраиваемый элемент UserControl в качестве корневого каталога Window.Content или контейнера для другого содержимого, к которому вы хотите применить состояния (например , Панель). Затем можно вызвать GoToState в элементе UserControl и применить состояния независимо от того, является ли остальное содержимое элементом Управления. Например, можно применить визуальные состояния к пользовательскому интерфейсу, который в противном случае состоит только из SwapChainPanel , если вы разместили его в элементе UserControl и объявили именованные состояния, которые применяются к свойствам родительского элемента UserControl или именованной части SwapChainPanel шаблона.

Применяется к

См. также раздел