2017-01-12 3 views
2

Контекст: У меня два Storyboards в моем UserControl. Один из них предназначен для перемещения пользователя UserControl, а один - для его выключения.Один раскадровки для нескольких триггеров

Все, что я делаю для слайда в/из устанавливает наценку до отрицательного значения для выскальзывания и к нулю втягивается.

Теперь я хочу sbShowLeftMenu раскадровка будет выполняться, когда UserControl для видимости установлено значение Visible. Кроме того, я хочу иметь возможность вручную перемещать UserControl с помощью кнопок BtnHide & BtnShow.

Теперь, если UserControl становится видимым sbShowLeftMenu активируется и элементы управления UserControl получает приближались. Переключение видимости между Collapsed и Visible такое поведение продолжается, как я хочу, чтобы это.

Теперь, если я ударил BtnHide, чтобы переместить UserControl из окна просмотра, все работает нормально, пока я снова не переключу видимость UserControl. Теперь Раскадровка больше не работает. Я все еще могу перемещать элементы управления UserControls с помощью кнопок, но «Видимый» триггер не запускает раскадровку.

Вот GIF примеры поведения:

С нажатием на «Database Search» Я установил видимость UserControl Видимые (потому что его привязанный к свойству «IsExpanded» от ExpanderControl), и это работает просто отлично:

Example GIF

Здесь я показываю, что происходит после того, как я вручную нажмите 'BtnHide':

Demonstration GIF

Это код UserControl:

<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; 
} 
Смежные вопросы