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

}
<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 также можно определить таким образом, чтобы он порождал неявный переход. Любое свойство зависимостей, специально предназначенное для анимации в визуальных состояниях VisualTransitionFrom или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 части шаблона.

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

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