首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加ScaleTransform破坏WPF动画

添加ScaleTransform破坏WPF动画
EN

Stack Overflow用户
提问于 2010-08-17 04:39:17
回答 2查看 2.5K关注 0票数 0

我正在制作资源管理器风格的界面动画,左侧是导航器窗格,右侧是工作区。导航器显示备注列表或日历--两者都是UserControls。应用程序功能区上的按钮在两个视图之间切换。我用动画的变化从旧的UserControl融合到新的。

动画标记非常简单,在这篇文章的底部完整地转载了它。我声明了两个用户控件,首先是Calendar,然后是NoteList,这样NoteList就可以覆盖和隐藏Calendar。我通过淡出备注列表从NoteList中融合到日历中--将其Opacity属性从1动画化为0,然后通过将备注列表淡入淡入,以另一种方式融合它--将相同的属性从0动画化为1:

从NoteList融合到日历:

代码语言:javascript
复制
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.5" />

从日历合并到NoteList:

代码语言:javascript
复制
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.5" />

动画运行得很好,但我发现将不透明度设置为0只会使Note List控件变得透明--它仍然覆盖了Calendar控件,这意味着我无法单击Calendar。因此,我在每个故事板上添加了一个ScaleTransform,以便在注释列表不显示时将其去掉。

在从NoteList到日历的融合中,我在将备注列表淡出为0之后将其ScaleTransform为0:

代码语言:javascript
复制
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="0" Duration="0:0:0" />

在从日历融合到NoteList时,我将备注列表ScaleTransform为1,然后将其淡入为1:

代码语言:javascript
复制
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0" />
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.5" />

这是我的问题:当我添加ScaleTransform时,它打破了从NoteList到日历的分解--笔记列表的不透明度立即变为0,而不是超过预期的0.5秒。但是从日历到笔记列表的融合仍然可以正常工作-笔记列表的不透明度在预期的0.5秒内从0动画到1。

我通过注释掉ScaleTransform声明来测试这个问题,动画再次运行正常。取消对ScaleTransforms的注释,当从“便笺”列表转到“日历”时,动画将再次中断。

有谁能建议为什么添加ScaleTransform会破坏这个动画,而且只在一个方向上?谢谢你的帮忙!

--

下面是完整的动画标记:

代码语言:javascript
复制
<ribbon:RibbonToggleButton x:Name="NoteListViewButton" LargeImageSource="Images/ListViewLarge.png" SmallImageSource="Images/ListViewSmall.png" Label="Note List" Click="OnViewButtonClick">
    <ribbon:RibbonToggleButton.Triggers>
        <EventTrigger RoutedEvent="ribbon:RibbonToggleButton.Checked">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0" />
                        <DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.5" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </ribbon:RibbonToggleButton.Triggers>
</ribbon:RibbonToggleButton>

<ribbon:RibbonToggleButton x:Name="CalendarViewButton" LargeImageSource="Images/CalendarViewLarge.png" SmallImageSource="Images/CalendarViewSmall.png" Label="Calendar" Click="OnViewButtonClick">
    <ribbon:RibbonToggleButton.Triggers>
        <EventTrigger RoutedEvent="ribbon:RibbonToggleButton.Checked">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.5" />
                        <DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="0" Duration="0:0:0" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </ribbon:RibbonToggleButton.Triggers>
</ribbon:RibbonToggleButton

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-17 05:07:26

我找到了答案。故事板同时执行所有动画,因此在从NoteList融合到日历的情况下,在不透明度动画有机会运行之前,ScaleTransform已设置为0。

解决方案是在ScaleTransform中为从NoteList到日历的融合设置BeginTime属性,以便为不透明动画提供运行时间。经过修改后,它看起来像这样:

代码语言:javascript
复制
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetName="NoteListControl" Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="0" Duration="0:0:0" BeginTime="0:0:0.5" />

请注意,在第二个动画声明的末尾,BeginTime属性设置为"0:0:0.5“。有了这些,动画就能工作了!

票数 0
EN

Stack Overflow用户

发布于 2010-08-17 04:58:04

也许您可以通过使用StoryBoard.Completed事件来克服ScaleTransform的问题,并将非活动控件的Visibility分别设置为HiddenCollapsed (如果有合适的属性)。

请参阅http://msdn.microsoft.com/en-us/library/system.windows.media.animation.timeline.completed.aspx

关于您的回答:您是否尝试过将Storyboard.Duration属性设置为0.5秒?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3497118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档