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>

Комментарии

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

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

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

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

  • Авторы или разработчики приложений добавляют элементы объекта VisualStateGroup в корневой элемент определения шаблона элемента управления в XAML с помощью присоединенного VisualStateManager.VisualStateGroups свойства. В элементе VisualStateGroup каждый VisualState представляет дискретное визуальное состояние элемента управления. Каждый VisualState имеет имя, представляющее состояние пользовательского интерфейса, которое может быть изменено пользователем или изменено логикой элемента управления. A VisualState состоит в основном из раскадровки. Это Storyboard предназначено для отдельных значений свойств зависимостей, которые должны применяться всякий раз, когда элемент управления находится в этом визуальном состоянии.
  • Управляйте переходом авторов или разработчиков приложений между этими состояниями путем вызова статического метода GoToStateManager VisualStateManager. Авторы элементов управления выполняют это всякий раз, когда логика элемента управления обрабатывает события, указывающие на изменение состояния, или логика управления инициирует изменение состояния самостоятельно. Для этого чаще используется код определения элемента управления, а не код приложения, поэтому все возможные визуальные состояния и их переходы и условия триггера существуют по умолчанию для кода приложения. Или код приложения, изменяющий визуальные состояния, позволяет управлять состояниями представления на уровне приложения в ответ на изменения размера или ориентации главного окна приложения.

При вызове GoToState изменения визуального состояния элемента управления VisualStateManager выполняет следующие действия:

  • Сначала определяется, существует ли состояние, которое соответствует stateName . В противном случае ничего не происходит, и метод возвращается false.
  • Если VisualState по имени stateName существует и имеет раскадровку, начинается раскадровка.
  • Если visualState , который элемент управления использовался из той же VisualStateGroup до недавно запрошенного состояния, имеет раскадровку, эта раскадровка останавливается. Кроме определенных свойств, к которым применяется анимация VisualState , элемент управления возвращается к первоначально загруженным состояниям из шаблона элемента управления и его композиции.

Если элемент управления уже находится в VisualState, запрошенном как stateName, возвращаетсяtrue, GoToState но в противном случае действие не будет перезапущено (раскадровка не будет перезапущена).

Общий шаблон реализации элемента управления — определить один частный метод класса элемента управления, который заботится обо всех возможных изменениях VisualState для элемента управления. Какое визуальное состояние следует использовать, проверяя свойства элемента управления. Эти свойства могут быть общедоступными или частными. Значения свойств настраиваются обработчиками в логике управления для таких событий, как OnGotFocus, и проверяются сразу перед установкой визуального состояния. В примере кода в этом разделе используется этот шаблон реализации. Кроме того, можно вызывать GoToState для отдельных состояний из обработчиков событий, от переопределений обработчика событий управления (методы onEvent ) или вспомогательных методов, вызываемых всеми возможными импульсами для изменения состояний (события, события автоматизации, логика инициализации).

Вы также можете вызвать GoToState из реализации PropertyChangedCallback для пользовательского свойства зависимостей.

Визуальные состояния и переходы

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

Custom VisualStateManager

В качестве расширенного сценария можно наследовать от VisualStateManager и изменить поведение по умолчанию GoToState . Производный класс должен переопределить защищенный метод GoToStateCore . Любой экземпляр пользовательского VisualStateManager использует эту логику Core при вызове метода GoToState .

Визуальные состояния для состояний представления приложения

Визуальные состояния не обязательно для пользовательских элементов управления. Визуальные состояния можно использовать из новых шаблонов элементов управления, которые применяются к любому экземпляру Control , где вы заменяете шаблон по умолчанию, задав свойство Template . Чтобы настроить эту настройку, необходимо определить шаблон элемента управления и визуальные состояния, которые вы планируете использовать в качестве ресурса стиля , который находится в любом Page.Resources или Application.Resources. Всегда лучше всего начать с копии шаблона по умолчанию и изменить только определенные аспекты шаблона или даже просто изменить некоторые визуальные состояния и оставить базовую композицию отдельно. Дополнительные сведения см. в шаблонах элементов управления XAML.

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

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

Визуальные состояния иногда полезны для сценариев, когда требуется изменить состояние определенной области пользовательского интерфейса, которая не сразу подкласс Control . Это невозможно сделать напрямую, так как для параметра GoToStateэлемента управления метода требуется Control подкласс, который ссылается на объект, на который действует VisualStateManager. Страница является подклассом Control , и это довольно редко, что вы будете отображать пользовательский интерфейс в контексте, где у вас нет Pageкорневого каталога Window.Content , не является подклассом Control . Мы рекомендуем определить пользовательский userControl как корневой, так Window.Content и контейнер для другого содержимого, к которому нужно применить состояния (например , панель). Затем вы можете вызвать GoToStateUserControl ваши и применить состояния независимо от того, является Controlли остальная часть содержимого . Например, можно применить визуальные состояния к пользовательскому интерфейсу, которое в противном случае состоит только из буфераChainPanel , если вы помещали его в свои UserControl и объявленные именованные состояния, которые применяются к свойствам родительского UserControl или именованной SwapChainPanel части шаблона.

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

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