2017-01-12 11 views
2

コンテキスト:私はUserControlに2つのStoryboardsを持っています。そのうちの1つは、UserControlをスライドさせるためのもので、もう1つはスライドさせるためのものです。複数のトリガーのストーリーボードを1つ

I /アウトでスライドのためにスライドさせると、ゼロに負の値にマージンを設定しているスライドのためにやっている。今

すべては、私がsbShowLeftMenuストーリーボードを実行したいときUserControlの可視性はVisibleに設定されています。また、ボタンBtnHide & BtnShowを使って手動でUserControlをイン/アウトすることができるようにしたいと思います。ユーザーコントロールが目に見えるようになる場合

は今 sbShowLeftMenuが活性化され、ユーザーコントロールをに移動します。この動作は続け CollapsedVisible間の可視性を切り替え、私はそれがしたいよう。

BtnHideを押して、UserControlの可視性を再び切り替えるまで、ViewControlからUserControlを移動しても問題ありません。今ストーリーボードはもう動作しません。私はボタンでUserControls in/outを移動することはできますが、 'Visible'トリガーはストーリーボードを開始しません。ここで

は、行動のGIFの例は以下のとおりです。

私は(ExpanderControlの「isExpandedとして」プロパティにその結合するので)可視に、ユーザーコントロールの可視性を設定し、それが動作する「データベース検索」をクリックしてうまく:

ここ

Example GIF

私は手動で 'BtnHide' をクリックした後に何が起こるかを示します。

Demonstration GIF

これは、ユーザーコントロールのコードです:

<UserControl.Resources> 
    <Style x:Key="TextBlockStyle"> 
     <Setter Property="TextBlock.FontSize" Value="10"></Setter> 
     <Setter Property="TextBlock.Margin" Value="1"></Setter> 
     <Setter Property="TextBlock.VerticalAlignment" Value="Center"></Setter> 
    </Style> 

    <Storyboard x:Key="sbShowLeftMenu"> 
     <ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnShow" Storyboard.TargetProperty="(UIElement.Visibility)"> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.01" Value="{x:Static Visibility.Collapsed}"/> 
     </ObjectAnimationUsingKeyFrames> 
     <ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnHide" Storyboard.TargetProperty="(UIElement.Visibility)"> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.01" Value="{x:Static Visibility.Visible}"/> 
     </ObjectAnimationUsingKeyFrames> 
     <ThicknessAnimation Storyboard.TargetProperty="Margin" Storyboard.TargetName="pnlLeftMenu" From="-650,0,0,0" To="0,0,0,0" DecelerationRatio=".9" Duration="0:0:1" /> 
    </Storyboard> 

    <Storyboard x:Key="sbHideLeftMenu"> 
     <ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnHide" Storyboard.TargetProperty="(UIElement.Visibility)"> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.01" Value="{x:Static Visibility.Collapsed}"/> 
     </ObjectAnimationUsingKeyFrames> 
     <ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnShow" Storyboard.TargetProperty="(UIElement.Visibility)"> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.01" Value="{x:Static Visibility.Visible}"/> 
     </ObjectAnimationUsingKeyFrames> 
     <ThicknessAnimation Storyboard.TargetProperty="Margin" Storyboard.TargetName="pnlLeftMenu" From="0,0,0,0" To="-650,0,0,0" AccelerationRatio=".9" Duration="0:0:1" /> 
    </Storyboard> 
</UserControl.Resources> 

<UserControl.Template> 
    <ControlTemplate> 

     <Grid Background="Red"> 
      <StackPanel Panel.ZIndex="2" Name="pnlLeftMenu" Orientation="Horizontal" HorizontalAlignment="Left" Margin="-650,0,0,0" Height="500"> 
       <!-- Content --> 
       <Border>The Content is in here</Border> 
       <Grid> 
        <Button x:Name="BtnShow" Height="25" Width="25" VerticalAlignment="Top" HorizontalAlignment="Left" > 
         <Button.Content> 
          <Path Stroke="Black" 
          StrokeThickness="2" 
          Data="M 0,0 L 0.5,0.5 L 0,1" 
          Stretch="Uniform"></Path> 
         </Button.Content> 
         <Button.Triggers> 
          <EventTrigger RoutedEvent="Button.Click"> 
           <BeginStoryboard Storyboard="{StaticResource sbShowLeftMenu}"></BeginStoryboard> 
          </EventTrigger> 
         </Button.Triggers> 
        </Button> 
        <Button x:Name="BtnHide" Height="25" Width="25" VerticalAlignment="Top" HorizontalAlignment="Left" Visibility="Collapsed" > 
         <Button.Content> 
          <Path Stroke="Black" 
          StrokeThickness="2" 
          Data="M 1,1 L 0.5,0.5 L 1,0" 
          Stretch="Uniform"></Path> 
         </Button.Content> 
         <Button.Triggers> 
          <EventTrigger RoutedEvent="Button.Click"> 
           <BeginStoryboard Storyboard="{StaticResource sbHideLeftMenu}"></BeginStoryboard> 
          </EventTrigger> 
         </Button.Triggers> 
        </Button> 
       </Grid> 
      </StackPanel> 
     </Grid> 

     <ControlTemplate.Triggers> 
      <Trigger Property="IsVisible" 
      Value="True" 
      my:TriggerTracing.TriggerName="BoldWhenMouseIsOver" 
      my:TriggerTracing.TraceEnabled="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard Name="sbShowLeftMenu" Storyboard="{StaticResource sbShowLeftMenu}"/> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard Name="xy" Storyboard="{StaticResource sbHideLeftMenu}"/> 
       </Trigger.ExitActions> 
      </Trigger> 
     </ControlTemplate.Triggers> 

    </ControlTemplate> 
</UserControl.Template> 

答えて

0

あなたはストーリーボードの操作に干渉され一部複雑なロジックを持っているようです。

私はトリガーではなく、コードの背後にこれをやってみることをお勧めします。 ステートマシンを作成し、状態によっては表示/非表示/非表示にします。


次のコードは、ストーリーボードを使用してブール状態に基づいてパネルを移動する類似のロジックに使用します。他の州と同様に可視性を処理するために、それを展開することができます。

private bool moveRight = true; // Start out on the left side, then move right. 

public void MoveRight() 
{ 
    try 
    { 
    if (moveRight) 
     { 
      (Resources["MoveToOpen"] as Storyboard)?.Begin(this, false); 
      (Resources["FlipArrowClose"] as Storyboard)?.Begin(this, false); 
     } 
     else 
     { 
      (Resources["MoveToClose"] as Storyboard)?.Begin(this, false); 
      (Resources["FlipArrowOpen"] as Storyboard)?.Begin(this, false); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    moveRight = !moveRight; 
} 
関連する問題