如何在ItemsControl中为ContentControl设置动画

时间:2012-02-25 01:46:07

标签: wpf mvvm itemscontrol contentcontrol caliburn

我喜欢使用ItemsControl来托管ContentsControls。每个新的ContentsControl都会在添加项目时为其内容设置动画,并且每个ContentControl都会覆盖前一个ContentControl。 ItemsControl和ContentControl内容使用命名约定与Caliburn Micro绑定。

                    <ItemsControl x:Name="OverlayStackedItems" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="Transparent">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Grid x:Name="ItemsHost" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <cc:DummyContentControl cal:View.Model="{Binding}" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>

ContentControl的定义如下:

   [ContentProperty("Content")]
public partial class DummyContentControl :ContentControl
{
    public DummyContentControl()
    {
    }

    static DummyContentControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(DummyContentControl), new FrameworkPropertyMetadata(typeof(ContentControl)));
    }


    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
    }

    protected override void OnContentChanged(object oldContent, object newContent)
    {
        LayoutUpdated += (sender, e) => 
        { 
        };
        UpdateLayout();

        base.OnContentChanged(oldContent, newContent);
    }

    void DummyContentControl_LayoutUpdated(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

    protected override Size MeasureOverride(Size constraint)
    {
        return base.MeasureOverride(constraint);
    }
}

所以现在最后我的问题。在真正的ContentControl中,我喜欢动画内容但是 当调用OnContentChange时,ContentControl的大小为0,其中创建了我的动画。在ContentControl中托管ContentControl时的调用顺序是:

  1. OnContentChanged(动画失败)
  2. OnApplyTemplate
  3. 的MeasureOverride
  4. 当ContentControl自行运行时,订单为:

    1. OnApplyTemplate
    2. MeasureOverride
    3. OnContentChanged(动画作品)
    4. 这里的问题是ItemsControl中新Item的完整视觉子树是0(DesiredSize,ActualSize = 0),因此我的动画代码失败了。 我希望这对某人有意义, 任何帮助都会很棒,Thx,J

      ------------------------------修订---------------- ---

      好的,我将OnLoaded事件处理程序添加到DummyControl的ctor中。 calles的顺序是 1. OnContentChanged(所有大小均为0) 2. OnApplyTemplate(所有大小均为0) 3. MeasureOverride(可能由ContentControl为所有子控件hostet调用几次) 4.已加载事件(所需大小设置为所有其他大小仍为0)

      可以用sombody解释推荐的如何动画ContentControl的做法 通过ItemsControl的hostet?

1 个答案:

答案 0 :(得分:0)

只需在XAML中执行所有操作并让动画执行此操作,而无需调用MeasureOverride()和其他挂钩。

<ItemsControl>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border>
                            <TextBlock Text="Whatever your template should look like"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                                <BeginStoryboard>
                                    <Storyboard >
                                        <DoubleAnimation Storyboard.TargetProperty="(Border.RenderTransform).(ScaleTransform.ScaleX)" Duration="0:0:0.5" From="0" To="1" />
                                        <DoubleAnimation Storyboard.TargetProperty="(Border.RenderTransform).(ScaleTransform.ScaleY)" Duration="0:0:0.5" From="0" To="1" />
                                        <DoubleAnimation Storyboard.TargetProperty="(Border.RenderTransform).(ScaleTransform.CenterX)" Duration="0:0:0.5" To="25" />
                                        <DoubleAnimation Storyboard.TargetProperty="(Border.RenderTransform).(ScaleTransform.CenterY)" Duration="0:0:0.5" To="25" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>