WPF XAML 网格可见性触发器

Posted

技术标签:

【中文标题】WPF XAML 网格可见性触发器【英文标题】:WPF XAML Grid Visibility Trigger 【发布时间】:2013-09-23 18:44:08 【问题描述】:

我在网格的第一行有一条状态消息,我希望它在可见性变化时滑入和滑出。 第一个可见性触发器效果很好,可以快速打开第一个网格行。一旦我添加了“折叠”触发器,就什么都没有了。当可见性设置为折叠时,如何反转动画以滑动关闭?

<Grid Grid.Row="0" Height="55" Visibility="Binding StatusMessageVisibility, Mode=TwoWay">
    <Grid.Style>
        <Style TargetType="Grid">
            <Style.Triggers>
                <Trigger Property="Visibility" Value="Visible">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height" From="0" To="55" Duration="0:0:.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
                <Trigger Property="Visibility" Value="Collapsed">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height" From="55" To="0" Duration="0:0:.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>                        
            </Style.Triggers>
        </Style>
    </Grid.Style>
    <TextBlock Text="Hi There" />
</Grid>

【问题讨论】:

【参考方案1】:

您应该删除网格中的Visibility 绑定并使用绑定到StatusMessageVisibility 属性的DataTrigger。如果你绑定网格的可见性,那么一旦它被折叠,它就会被折叠,你将无法看到动画。

另外,不要使用两个带有EnterActions 的数据触发器,而是使用一个同时具有ExitAction 的数据触发器来表示折叠状态:

<Grid Grid.Row="0" Height="55">
    <Grid.Style>
        <Style TargetType="Grid">
            <Style.Triggers>
                <DataTrigger Binding="Binding StatusMessageVisibility" Value="Visible">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height" From="0" To="55" Duration="0:0:.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                    <DataTrigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height" From="55" To="0" Duration="0:0:0.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.ExitActions>
                </DataTrigger>               
            </Style.Triggers>
        </Style>
    </Grid.Style>
    <TextBlock Text="Hi There" />
</Grid>

【讨论】:

在我的情况下,默认情况下必须折叠网格,但如果我从网格中删除绑定,它总是可见或总是折叠,这取决于我如何在网格上初始化 Visibility 并且数据触发器永远不会启动。似乎 datatrigger 不更新网格可见性。我能做什么? 似乎 datatrigger 不更新网格可见性

以上是关于WPF XAML 网格可见性触发器的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 中动态更改网格的可见性

如何在自定义 wpf 控件上绑定数据网格列的可见性?

XAML 在多个选项之间切换可见性

WPF:通过字符串内容绑定可见性

WPF 绑定不更新可见性

WPF - 可以将标签的属性(可见性)绑定到标签的目标吗?