首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将动画属性绑定到ItemsControl内单击的可视项目

将动画属性绑定到ItemsControl内单击的可视项目
EN

Stack Overflow用户
提问于 2015-05-28 00:29:40
回答 1查看 95关注 0票数 0

我几乎可以将整个问题放入问题主题中,但有趣的部分并不适合。所以上面问题的棘手之处在于:

“我的动画”不适用于单击的视觉子对象,而是应用于包含可视子对象的ItemsControl的父容器。所以我的问题是为数据绑定找到合适的“源”。

但首先是一些XAML:这是我试图应用的动画(在Storyboard资源中):

代码语言:javascript
运行
复制
<DoubleAnimation
                Storyboard.Target="{x:Reference ItemsControlGrid}"
                Storyboard.TargetProperty="(Canvas.Left)"
                From="0" To="{Binding Source=Tile, Path=Width}"/>

有问题的部分是动画的"To“属性。(忽略Path=Width,它只是我所知道的存在于绑定源上的测试属性)。如果我使用硬编码的值,它已经可以工作了。

"Tile“是我要绑定到的DataTemplate控件的名称。

它看起来是这样的:

代码语言:javascript
运行
复制
<DataTemplate DataType="{x:Type local:Task}">
        <Grid x:Name="Tile"  MouseDown="Task_OnClick" MinWidth="200" Background="{StaticResource TileBackground}" Margin="7" RenderTransformOrigin="0.5,0.5" >
            <Grid.Triggers>
                <EventTrigger RoutedEvent="Grid.MouseDown">
                   <BeginStoryboard Storyboard="{StaticResource AnimLeave}"></BeginStoryboard>
                </EventTrigger>
            </Grid.Triggers>
...content
        </Grid>
    </DataTemplate>

ItemsControl的结构如下:

代码语言:javascript
运行
复制
<ScrollViewer>
    <Canvas>
        <Grid x:Name="ItemsControlGrid">
        <ItemsControl x:Name="Taskboard" >
            <ItemsControl.ItemsSource>
                <CompositeCollection>
                    <CollectionContainer Collection="{Binding Tasks, Source={x:Static ...secret}}"/>
                    <Button>
                    </Button>
                </CompositeCollection>
            </ItemsControl.ItemsSource>

据我所知,WPF不能工作,因为动画被应用于ItemsControl的父级,因此动画发起者的“绑定上下文”(可视子"Tile")完全丢失了。

因此,总结一下我最终想要实现的目标:

我想要动画的“平铺”项目,以流畅地填充整个可见的滚动浏览器,当我点击它。我试图通过同时调整Tile的大小来实现这种效果,同时以某种方式移动父网格,即tile的中心移动到滚动查看器的中心。

简而言之:我想让点击的“磁贴”平滑地打开成磁贴的“细节”视图(显示完全不同的内容)

即使有一种完全不同/更好的方法来解决我的实际问题,我仍然希望知道如何完成数据绑定。

提前谢谢。我相信我会从即将到来的答案中学到很多东西。

EN

回答 1

Stack Overflow用户

发布于 2015-05-28 21:24:47

问题是故事板是一种资源。当我在DataTemplate中声明它时,我可以使用

代码语言:javascript
运行
复制
<DoubleAnimation
    Storyboard.Target="{x:Reference ItemsControlGrid}"
    Storyboard.TargetProperty="(Canvas.Top)"
    Duration="{StaticResource ZoomInTime}" BeginTime="{StaticResource FadeOutTime}"
    From="0" To="{Binding ElementName=Tile, TargetNullValue=0, Path=Tag.(Point.Y)}">

一个棘手的部分是"Path=Tag.(Point.Y)“。我使用我的Tile的标签来存储我在后台代码中计算的目标位置,如下所示:

代码语言:javascript
运行
复制
var tile = ((Grid) sender);
GeneralTransform transform = tile.TransformToAncestor(CanvasTaskboard);
tile.Tag = transform.Inverse.Transform(new Point((CanvasTaskboard.ActualWidth - tile.ActualWidth) / 2, (CanvasTaskboard.ActualHeight - tile.ActualHeight) / 2));

效果很好。动画看起来棒极了。

更新:我应该提一下,也可以通过名称“找到”Tile上的动画,并直接在后面的代码中设置" to“属性。

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

https://stackoverflow.com/questions/30488216

复制
相关文章

相似问题

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