你能在VisualStateManager中为TemplatedParent设置ZIndex动画吗?

时间:2014-04-11 02:13:35

标签: wpf silverlight canvas z-index visualstatemanager

我有一个自定义控件,我想在其上添加鼠标悬停行为,将整个对象置于z顺序的顶部,然后当鼠标悬停在a上时让它回落到位画布上的不同对象。

我有以下XAML,其中颜色设置动画,控件中矩形的ZIndex动画(遮蔽椭圆),但我无法将整个控件带到其他所有的前面父画布中的控件。 XAML的麻烦部分在下面的前后显示为空行。

<Style TargetType="local:CustomControl1">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:CustomControl1">
                <Grid x:Name="PartLayoutRoot">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="MouseOver">
                                <Storyboard>

                                    <Int32AnimationUsingKeyFrames 
                                            Storyboard.Target="{Binding RelativeSource={RelativeSource TemplatedParent} }"
                                            Storyboard.TargetProperty="(Canvas.ZIndex)">
                                        <DiscreteInt32KeyFrame KeyTime="0" Value="99" />
                                    </Int32AnimationUsingKeyFrames>

                                    <Int32AnimationUsingKeyFrames 
                                            Storyboard.TargetName="Rect"
                                            Storyboard.TargetProperty="(Canvas.ZIndex)">
                                        <DiscreteInt32KeyFrame KeyTime="0" Value="99" />
                                    </Int32AnimationUsingKeyFrames>
                                    <ColorAnimation To="Red" 
                                        Storyboard.TargetName="Rect" 
                                        Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"
                                        Duration="0:0:1" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>

                    <Rectangle x:Name="Rect" Fill="Blue" Height="40" Width="40" />
                    <Ellipse Fill="Green" Height="30" Width="30" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

基本上我可以为ZIndex intra -control设置动画,但不能 inter -control。我已经阅读了this post,这意味着我应该可以这样做 - 请注意,在我的情况下,模板父自定义控件的实例,而不是列表中的元素所以这种情况下的解决方案似乎并不适用。我得到的错误是

  

System.Windows.Data错误:2:找不到管理FrameworkElement   或目标元素的FrameworkContentElement。 BindingExpression:(无   路径);的DataItem = NULL;目标元素是&#39; Int32AnimationUsingKeyFrames&#39;   (的HashCode = 58939632);目标财产是&#39;目标&#39; (类型   &#39;的DependencyObject&#39)

在其他地方,我读过这个并不起作用,因为从Binding回来的东西不是一个依赖对象。我现在所有人都在使用代码,但是寻找更优雅的XAML解决方案。

1 个答案:

答案 0 :(得分:0)

此处的解决方案是更改ZIndex而不是模板的VisualState,但是在样式的触发器中。

<Style TargetType="local:CustomControl1">
    <Setter Property="Template">
        ...
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="(Canvas.ZIndex)" Value="99"/>
        </Trigger>
    </Style.Triggers>
</Style>

希望这有帮助!