更改可见性时,WPF中的动画崩溃和控件扩展VB.Net

时间:2020-10-11 00:51:07

标签: wpf vb.net

当我将<StackPanel>的可见性更改为Collapsed时,我希望能够为其动画。我找到了这个Question,为此,我接受了答案。我创建了以下XAML代码:

                        <Grid x:Name="grdBRDS">
                            <Grid.Resources>
                                <Style TargetType="StackPanel" x:Key="XPND">
                                    <Setter Property="RenderTransform">
                                        <Setter.Value>
                                            <ScaleTransform ScaleX="1"/>
                                        </Setter.Value>
                                    </Setter>
                                    <Style.Triggers>
                                        <Trigger Property="Tag" Value="Hide">
                                            <Trigger.EnterActions>
                                                <BeginStoryboard>
                                                    <Storyboard>
                                                        <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX"
                                                                         From="1" To="0"
                                                                         Duration="0:00:1"/>
                                                    </Storyboard>
                                                </BeginStoryboard>
                                            </Trigger.EnterActions>
                                        </Trigger>
                                        <Trigger Property="Tag" Value="Show">
                                            <Trigger.EnterActions>
                                                <BeginStoryboard>
                                                    <Storyboard>
                                                        <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX"
                                                                         From="0" To="1"
                                                                         Duration="0:00:1"/>
                                                    </Storyboard>
                                                </BeginStoryboard>
                                            </Trigger.EnterActions>
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </Grid.Resources>
                        <StackPanel x:Name="pnlTRG" Orientation="Horizontal" Margin="7" Style="{StaticResource XPND}">

这些点击事件有两个按钮:

    Private Sub btnCLPS_Click(sender As Object, e As RoutedEventArgs) Handles btnCLPS.Click
        pnlTRG.Tag = "Hide"
        btnCLPS.Visibility = 2 'This is just to have the buttons replace each other rather than create 
        btnEXPD.Visibility = 0 'logic for which action to invoke
    End Sub

    Private Sub btnEXPD_Click(sender As Object, e As RoutedEventArgs) Handles btnEXPD.Click
        pnlTRG.Tag = "Show"
        btnCLPS.Visibility = 0
        btnEXPD.Visibility = 2
    End Sub

一切正常。但是,在我折叠<StackPanel>并对其进行扩展之后,即使扩展成功了,折叠也不再起作用(先缩放到0,然后再缩放到1)。我想念什么?

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案。我创建了4种不同的样式:

  • 一个正在崩溃(活动)
  • 一个用于折叠(静态)
  • 一个用于扩展(有效)
  • 一个用于扩展(静态)

按钮设置活动样式,触发过渡,然后使用计时器触发设置适当的静态样式。这是最终代码:

XAML:

<Grid x:Name="grdBRDS">
    <Grid.Resources>
        <Style TargetType="StackPanel" x:Key="HDN">
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <ScaleTransform ScaleX="0"/>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="StackPanel" x:Key="SHN">
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <ScaleTransform ScaleX="1"/>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="StackPanel" x:Key="CLPS">
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <ScaleTransform ScaleX="1"/>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="Tag" Value="Hide">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX"
                                                    From="1" To="0"
                                                    Duration="0:00:1"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </Style.Triggers>
        </Style>
        <Style TargetType="StackPanel" x:Key="XPND">
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <ScaleTransform ScaleX="0"/>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="Tag" Value="Show">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX"
                                                    From="0" To="1"
                                                    Duration="0:00:1"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Grid.Resources>
<StackPanel x:Name="pnlTRG" Orientation="Horizontal" Margin="7">

计时器和按钮的VB:

    Private tmrXPD As New Threading.DispatcherTimer

    Private Sub NewTmr()
        InitializeComponent()
        tmrXPD.Interval = TimeSpan.FromSeconds(1.1)
        AddHandler tmrXPD.Tick, New EventHandler(AddressOf tmrXPD_Tick)
    End Sub

    Private Sub tmrXPD_Tick(sender As Object, e As RoutedEventArgs)
        ExpansionState(Convert.ToString(sender, Tag))
    End Sub

    Private Sub ExpansionState(ByVal strSTATE As String)
        Select Case strSTATE
            Case "HDN"
                pnlTRG.Style = DirectCast(grdBRDS.Resources("HDN"), Style)
                pnlTRG.Tag = "Standby"
            Case "SHN"
                pnlTRG.Style = DirectCast(grdBRDS.Resources("SHN"), Style)
                pnlTRG.Tag = "Standby"
        End Select
    End Sub

    Private Sub btnCLPS_Click(sender As Object, e As RoutedEventArgs) Handles btnCLPS.Click
        pnlTRG.Style = DirectCast(grdBRDS.Resources("CLPS"), Style)
        btnCLPS.Tag = "HDN"
        pnlTRG.Tag = "Hide"
        tmrXPD.Start()
        btnCLPS.Visibility = 2
        btnEXPD.Visibility = 0
    End Sub

    Private Sub btnEXPD_Click(sender As Object, e As RoutedEventArgs) Handles btnEXPD.Click
        pnlTRG.Style = DirectCast(grdBRDS.Resources("XPND"), Style)
        btnCLPS.Tag = "SHN"
        pnlTRG.Tag = "Show"
        tmrXPD.Start()
        btnCLPS.Visibility = 0
        btnEXPD.Visibility = 2
    End Sub