Как вы сохраняете изменения, внесенные триггерами VisualState после установки другого VisualState?

Не уверен, правильно ли я сформулировал вопрос. Так что терпите меня, если я ожидаю чего-то абсурдного. Я создаю приложение UWP на C # / XAML win10 по шаблону MVVM. Я определил несколько визуальных состояний для работы с более широкими экранами, а также некоторые для запуска некоторых анимаций. Проблема, с которой я столкнулся, заключается в том, что когда визуальное состояние для запуска анимации вызывается с помощью метода GoToState VisualStateManager, сеттеры, на которые воздействует VisualState, содержащий адаптивные триггеры, теряются. Вот пример кода:

//Defining my grid here
<Grid x:Name="gridNewDrawing" Margin="4">
<Button x:Name="Confirm" Click="Button_Confirm_Click" Width="180" MaxWidth="220" Height="36" HorizontalAlignment="Left" Style="StaticResource StyleButtonGeneral}"/>
<Button x:Name="Cancel" Click="Button_Cancel_Click" Width="180" MaxWidth="220" Height="36" HorizontalAlignment="Left" Style="StaticResource StyleButtonGeneral}"/>
</Grid>

<VisualStateManager.VisualStateGroups>
            <VisualStateGroup>                
                <VisualState x:Name="WideLayoutTrigger">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="640" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="gridNewDrawing.Margin" Value="16" />                        
                    </VisualState.Setters>
                </VisualState>
                <VisualState x:Name="AnimationState">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Cancel" Storyboard.TargetProperty="Visibility" Duration="0">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed" />
                        </ObjectAnimationUsingKeyFrames>                                     
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

Когда ширина больше 640 пикселей; поле gridNewDrawing переключается на 16; но когда я явно вызываю анимацию, используя

GoToState ("AnimationState")

Поле по умолчанию снова равно 4. Могу ли я сохранить изменения, сделанные с помощью адаптивного триггера, при настройке других визуальных стилей?


person Sanjay    schedule 24.11.2015    source источник
comment
Попробуйте делать все в коде без xaml.   -  person AnjumSKhan    schedule 24.11.2015
comment
Состояние AnimationState не определяет никаких полей, поэтому оно принимает значение по умолчанию, равное 4. Если вы хотите, вы можете установить раскадровку в ресурсах вместо состояния и при необходимости вызывать раскадровку. Или добавьте также сеттер в AnimationState в зависимости от ваших целей   -  person Juan Pablo Garcia Coello    schedule 24.11.2015


Ответы (1)


Поле сетки снова изменится на значение по умолчанию, потому что ваши VisualState находятся в том же VisualStateGroup. Вы можете установить AnimationState в другом VisualStateGroup, чтобы сохранить изменения, сделанные AdaptiveTrigger.

См. примечания к VisualStateGroup класс.

Набор визуальных состояний в каждой VisualStateGroup должен быть взаимоисключающим в группе. Другими словами, элемент управления должен всегда использовать ровно одно из визуальных состояний из каждой из его определенных групп VisualStateGroup. Если есть случай, когда элемент управления должен находиться одновременно в двух состояниях, убедитесь, что эти два состояния находятся в разных группах.

Поэтому примените следующий код, чтобы получить то, что вы хотите:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="WindowStates">
        <VisualState x:Name="WideLayoutTrigger">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="640" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="gridNewDrawing.Margin" Value="16" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
    <VisualStateGroup x:Name="OtherStates">
        <VisualState x:Name="AnimationState">
            <Storyboard>
                <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="Cancel" Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed" />
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>
person Jay Zuo    schedule 24.11.2015