0

contentControlから継承するカスタムコントロールを作成しました。コントロールは、PlaneProjection.RotationXのアニメーションを使用して、開いている状態から閉じた状態に変化します。VisualStateManager.GoToState useTransitionsカスタムコントロールで無視されるUWP

コントロールの初期状態を閉じた状態にします。私がchangeVisualState(false)と設定しても、アプリが起動したときに開いた状態から閉じた状態への遷移が表示されます。

私は間違っていますか?

マイコード:

public sealed class FlipPanel : ContentControl 
{ 
    private VisualState collapsedState; 
    private FrameworkElement contentElement; 

    public FlipPanel() 
    { 
     this.DefaultStyleKey = typeof(FlipPanel); 
    } 

    public bool IsOpen 
    { 
     get { return (bool)GetValue(IsOpenProperty); } 
     set { SetValue(IsOpenProperty, value); } 
    } 

    public static readonly DependencyProperty IsOpenProperty = 
     DependencyProperty.Register("IsOpen", typeof(bool), typeof(FlipPanel), new PropertyMetadata(false, onIsOpenChanged)); 

    private static void onIsOpenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 

     FlipPanel flipPanel = d as FlipPanel; 
     flipPanel.changeVisualState(true); 
    } 

    private void changeVisualState(bool useTransitions) 
    { 
     Debug.WriteLine(IsOpen.ToString()); 
     if (IsOpen) 
     { 
      if (contentElement != null) 
      { 
       contentElement.Visibility = Visibility.Visible; 
      } 
      VisualStateManager.GoToState(this, "Opening", useTransitions); 
     } 
     else 
     { 
      VisualStateManager.GoToState(this, "Closing", useTransitions); 
     } 
    } 

    protected override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     contentElement = (FrameworkElement)GetTemplateChild("Content"); 

     if (contentElement != null) 
     { 
      collapsedState = (VisualState)GetTemplateChild("Closing"); 

      if ((collapsedState != null) && (collapsedState.Storyboard != null)) 
      { 
       collapsedState.Storyboard.Completed += (object sender, object e) => 
       { 
        contentElement.Visibility = Visibility.Collapsed; 
       }; 
      } 

      changeVisualState(false); 
     }   
    } 
} 

と私のStyle

<Style TargetType="local:FlipPanel" > 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:FlipPanel"> 
       <Grid> 

        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="ViewStates"> 
          <VisualState x:Name="Opening"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationX)" Storyboard.TargetName="Content"> 
             <EasingDoubleKeyFrame KeyTime="0" Value="-90"/> 
             <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Closing"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationX)" Storyboard.TargetName="Content"> 
             <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
             <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="90"/> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 

        <Border BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}"> 
         <Grid> 
          <ContentPresenter Content="{TemplateBinding Content}" x:Name="Content"> 
           <ContentPresenter.Projection> 
            <PlaneProjection CenterOfRotationX="0.5"/> 
           </ContentPresenter.Projection> 
          </ContentPresenter> 
         </Grid> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

答えて

0

私はあなたがストーリーボードのCompletedイベントで倒れContentを行い、その後、あなたがchangeVisualState(false);を設定するためであると考え、それが行います「閉鎖」ストーリーボードが完了してからは何もありません。

私はこのようなOnApplyTemplateのあなたのコードを修正し、それが動作します:

protected override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 
    contentElement = (FrameworkElement)GetTemplateChild("Content"); 
    if (contentElement != null) 
    { 
     if (!IsOpen) 
      contentElement.Visibility = Visibility.Collapsed; 
     else 
      changeVisualState(true); 
    } 
} 

enter image description here

+0

感謝。ただ一つの質問。したがって、 'VisualStateManager.GoToState'メソッドで' useTransitions'を 'false'に設定するとアニメーションが実行されますか? – PutraKg

+0

@PutraKg、OnApplyTemplate()でuseTransitionsをfalseに設定すると、アニメーションが完了しているため、動作しません。 –

関連する問題