UWP VisualStateManager.GotoState работает не правильно - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть пользовательский элемент управления MediaPlayerControl. В его шаблоне я определяю VisualStateGroup:

<VisualStateGroup x:Name="SizeState">
    <VisualState x:Name="Normal" />
    <VisualState x:Name="LargeSize" >
        <Storyboard>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MediaInfo_Border" Storyboard.TargetProperty="(Grid.ColumnSpan)" >
                 <DiscreteObjectKeyFrame KeyTime="0" Value="1"/>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MediaInfo_Border" Storyboard.TargetProperty="(Grid.RowSpan)" >
                 <DiscreteObjectKeyFrame KeyTime="0" Value="2"/>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PrimaryMediaControl_Border" Storyboard.TargetProperty="HorizontalAlignment" >
                  <DiscreteObjectKeyFrame KeyTime="0" Value="Center"/>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MediaTransportControls_Timeline_Border" Storyboard.TargetProperty="(Grid.Column)" >
                 <DiscreteObjectKeyFrame KeyTime="0" Value="1"/>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MediaTransportControls_Timeline_Border" Storyboard.TargetProperty="(Grid.ColumnSpan)" >
                 <DiscreteObjectKeyFrame KeyTime="0" Value="1"/>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MoreButton" Storyboard.TargetProperty="Visibility" >
                 <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SecondaryTrim_MenuFlyOut" Storyboard.TargetProperty="Visibility" >
                 <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TrimButton" Storyboard.TargetProperty="Visibility" >
                 <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
             </ObjectAnimationUsingKeyFrames>
         </Storyboard>
    </VisualState>
</VisualStateGroup>

А в случае SizeChanged я вызываю функцию ChangeState():

private void MediaPlayerControl_SizeChanged(object sender, object e)
{
    ChangeState();
}
private void ChangeState()
{
    string state = "";
    if (Window.Current.Bounds.Width < 600)
    {
        state = "Normal";
    }
    else
    {
        state = "LargeSize";
    }
    VisualStateManager.GoToState(this, state, false);
}

Хотя VisualStateManager.GoToState возвращает true, а пользовательский интерфейс меняется на состояние LargeSize, но через короткое время автоматически изменяется на Normal состояние.

Если я использую событие LayoutUpdated, оно работает правильно, но производительность не очень хорошая.

Можно ли использовать GotoState с событием SizeChanged?

...