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時,動畫就完成了,所以它不起作用。 –