使用相对绑定将prop.ActualHeight绑定到DoubleAnimation.To prop

时间:2013-12-05 20:48:28

标签: wpf animation binding relative

我尝试使用相对绑定并将Window.ActualHeight属性绑定到DoubleAnimation.To属性。

相对绑定不起作用,但如果我使用ElementName绑定则可以正常工作。

不工作:

<Window xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="Sample.Window"
        x:Name="Shell"
        Title="Sample"
        Width = "525"
        Height = "350">

    <Canvas Height="400">
        <Ellipse Canvas.Left="80"
                 Canvas.Top="0"
                 Width="30"
                 Height="30"
                 Fill="LimeGreen">
            <Ellipse.Triggers>
                <EventTrigger RoutedEvent="Ellipse.Loaded">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)"
                                             Duration="0:0:5"
                                             RepeatBehavior="Forever"
                                             AutoReverse="True"
                                             To="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}, Path=ActualHeight}" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Ellipse.Triggers>
        </Ellipse>
    </Canvas>
</Window>

这项工作:

 <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)"
                                         Duration="0:0:5"
                                         RepeatBehavior="Forever"
                                         AutoReverse="True"
                                         To="{Binding ElementName=Shell, Path=ActualHeight}"/>  

可以使用相对绑定到Window.ActualHeight属性吗?

编辑:

我在路由事件上再次测试Ellipse.Loaded动画不起作用,但是如果我将路由事件更改为MouseEnter动画工作。我发布了所有项目。

sample download

感谢

1 个答案:

答案 0 :(得分:1)

奇怪的是,如果有frameworkElement traverses Visual Tree till ancestral window,那么DoubleAnimation too is able to find ancestral window但是如果没有元素指的是祖先窗口,DoubleAnimation就无法遍历Visual树。

在你的样本中,我只是遍历动画之外的窗口,它可以工作。测试此样本(traverse tree using Tag property of canvas) -

<Canvas Height="400"
        Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                                                  AncestorType=Window}}"> <-HERE
   <Ellipse Canvas.Left="80"
            Canvas.Top="0"
            Width="30"
            Height="30"
            Fill="LimeGreen">
      <Ellipse.Triggers>
         <EventTrigger RoutedEvent="Ellipse.Loaded">
             <BeginStoryboard>
                 <Storyboard>
                   <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)"
                                    Duration="0:0:5"
                                    RepeatBehavior="Forever"
                                    AutoReverse="True"
                                    To="{Binding RelativeSource={RelativeSource 
                                                 AncestorType={x:Type Window}, 
                                                 Mode=FindAncestor}, 
                                                 Path=ActualHeight}" />
                  </Storyboard>
              </BeginStoryboard>
          </EventTrigger>
       </Ellipse.Triggers>
    </Ellipse>
 </Canvas>