在成功应用之前触发可见性更改

时间:2016-04-11 15:09:47

标签: c# wpf

我有一个用户控件的样式:

<Style x:Key="AddServerPanel" TargetType="{x:Type uc:AddServer}">
    <Style.Triggers>
        <Trigger Property="Visibility" Value="Visible">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:0.2" From="252,550,26,0" To="252,248,26,0" />
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
        </Trigger>

        <Trigger Property="Visibility" Value="Hidden">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:0.2" From="252,248,26,0" To="252,550,26,0" />
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
        </Trigger>
    </Style.Triggers>
</Style>

当我点击按钮时,我在后台隐藏了一个用户控件。我想要一个幻灯片并滑出动画。此代码已经可用于滑入但滑动不能正常工作,因为控件刚刚消失。我认为这是因为visibility属性应用于控件,然后调用触发器。如何修复此行为以使控件具有适当的“滑出”效果?

修改

我更改了代码并切换到DataTrigger。 但这是有效的,但我只是在Binding属性值为false时看到动画。这真的很好奇。 同样很高兴知道如何将ThicknessAnimation中的“From”属性设置为控件的当前边距。

<uc:AddServer x:Name="AddServerPanel" Height="300" Width="570" Margin="252,550,26,0">
    <uc:AddServer.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=AddServerPanelVisible}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:2" From="252,550,26,0" To="252,248,26,0" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=AddServerPanelVisible}" Value="False">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:2" From="252,248,26,0" To="252,550,26,0"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </uc:AddServer.Style>
</uc:AddServer>

1 个答案:

答案 0 :(得分:1)

如果您使用动画显示/隐藏控件,则可能是在操纵所述控件的不透明度。如果是这种情况,您可以在代码中开始Storyboard,并在完成后将visibility标志设置为true。这将首先运行动画,然后设置可见性。

但是。我应该指出,因为你已经通过不透明度隐藏了控件,所以在这一点上没有必要改变它的可见性。

另一种选择是设置可见性标志(不绑定到控件的可见性属性),当标志值更改时,启动相应的Storyboard(例如,如果flag为true,则显示控件或开始显示动画)

我还想解释为什么你现在所做的事情。

每当你设置一个触发器时,你就告诉控件在属性等于这样的值时做某事。发生的事情是控件首先隐藏,当隐藏可见性时,它才会启动隐藏动画。唯一的问题是......它已经隐藏了!这就是我的解决方案所在;)

修改

实现了您的动画效果,而不是不透明度。在任何一种情况下,控件在开始动画之前总是被隐藏,这就是问题所在。

<强>解决方案

以下是一个例子:

<DataTrigger Binding="{Binding IsVisible}" Value="True">
    <DataTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <!-- Fade in animation -->
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding IsVisible}" Value="False">
    <DataTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <!-- Fade out animation -->
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.EnterActions>
</DataTrigger>

IsVisible是您必须定义的标志。其余的很简单。