多个触发器的一个故事板

时间:2017-01-12 15:59:30

标签: wpf xaml user-controls wpf-animation

背景信息:我的Storyboards中有两个UserControl。其中一个用于滑动UserControl,一个用于滑动它。

我为滑入/滑出做的所有操作都是将边距设置为滑出的负值,将滑动设置为零。

现在,我想在sbShowLeftMenu的可见性设置为UserControl时执行Visible故事板。此外,我希望能够使用按钮UserControl&手动滑动BtnHide进/出。 BtnShow

现在,如果UserControl变得可见,则sbShowLeftMenu被激活并且UserControls被移入。在CollapsedVisible之间切换可见性这种行为将继续,正如我所希望的那样。

现在,如果我点击BtnHide将UserControl移出视口,一切正常,直到我再次开始切换UserControl的可见性。现在故事板已经不再适用了。我仍然可以使用按钮移动/移出UserControl,但是可见'可见'触发器无法启动故事板。

以下是行为的gif示例:

点击'数据库搜索'我将UserControl的Visibility设置为Visible(因为它绑定到ExpanderControl的' IsExpanded'属性)并且它运行正常:

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>

1 个答案:

答案 0 :(得分: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;
 }
相关问题