当控件变为可见时,如何使其淡入/淡出?
以下是我失败的尝试:
<Window x:Class="WadFileTester.Form1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="MyWindow" Title="WAD File SI Checker" Height="386" Width="563" WindowStyle="SingleBorderWindow" DragEnter="Window_DragEnter" DragLeave="Window_DragLeave" DragOver="Window_DragOver" Drop="Window_Drop" AllowDrop="True">
<Window.Resources>
<Style TargetType="ListView" x:Key="animatedList">
<Style.Triggers>
<DataTrigger Binding="{Binding Visibility}" Value="Visible">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0.0" To="1.0" Duration="0:0:5"
/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<ListView Name="listView1" Style="{StaticResource animatedList}" TabIndex="1" Margin="12,41,12,12" Visibility="Hidden">
</ListView>
</Grid>
</Window>
8条答案
按热度按时间zbwhf8kr1#
我不知道如何在纯XAML中实现这两种动画(淡入和淡出)。但是简单的淡出可以相对简单地实现。用触发器替换DataTriggers,并删除ExitActions,因为它们在淡出场景中没有意义。下面是您将得到的内容:
但是,嘿,不要给予。如果你想支持这两个动画,我可以建议在XAML后面编写一些小代码。在我们做了一个技巧之后,我们将通过在XAML中添加一行代码来获得你想要的:
每次我们将btn.Visibility从Visible更改为Hidden/Collapsed按钮时,该按钮将淡出。而每次我们将Visibility更改为Back时,该按钮将淡入。此技巧适用于任何FrameworkElement(包括ListView:))。
下面是VisibilityAnimation.isActive附加属性的代码:
这里最重要的是CoerceVisibility()方法。正如你所看到的,我们不允许改变这个属性,直到淡入淡出动画完成。
这段代码既不是线程安全的,也不是没有错误的。它的唯一目的是显示方向:)。所以请随意改进,编辑和获得声誉;).
yizd12fk2#
你不能直接使用Visibility属性来淡出,因为在它上面设置一个触发器会首先隐藏/折叠控件,然后动画化它。所以基本上你会在一个折叠的控件上得到一个动画=〉什么都没有。
一种“可靠”的方法是引入一个新的依赖属性(附加的或未附加的),比如
IsOpen
,并在其上设置一个属性触发器IsOpen=True
,其中:输入操作:
退出操作:
下面是一个例子:
5ssjco0h3#
我用了一种稍微不同的方法--我得到了Ray对this question的回答的扩展版本,它向所有适当折叠或显示元素的东西添加了FadeIn()和FadeOut()扩展方法,然后我可以在它们上调用FadeIn()和FadeOut(),而不是使对象可见--它可以在没有任何特定动画代码的情况下对任何元素工作。
ogsagwnx4#
我知道这个问题有点老了,但我现在才读过它,我已经调整了Anvaka给出的代码。它支持绑定到可见性(仅当绑定模式设置为双向时)。它还支持2个不同的持续时间值的淡入和淡出。
下面是类:
46qrfjad5#
最好使用行为来完成此操作
这是专门应用于边框-我还没有尝试过用户控件,但我希望同样适用。
若要使用它,您需要Blend Interactivity命名空间:
并在您要在其上执行行为的Border上使用此标记:
您还需要为行为类添加命名空间。
vwhgwdsa6#
现在已经很老了,但是你能不能不把DoubleAnimations链接起来?
8qgya5xd7#
您可能想尝试AutoReverse属性...虽然我不确定它是否按您希望的方式工作。这是我在MSDN上找到的内容:
当时刻表的AutoReverse属性设定为true,且其RepeatBehavior属性导致它重复时,每个向前反覆运算后面都会跟着一个向后反覆运算。这会重复一次。例如,AutoReverse值为true且反覆运算计数为2的时刻表会向前播放一次,然后向后播放,再向前播放,再向后播放。
unhi4e5o8#
我更喜欢Nock's XAML-only solution。结合Mike Nakis的评论,它给了我一个完美的解决方案。我自己也在DataTrigger上挣扎。这就是为什么我想在这里分享它:
另外,不要忘记在代码后面为
Property
IsOpen 实现INotifyPropertyChanged
。