1

ItemsControlを使用してContentsControlsをホストするのが好きです。新しいContentsControlはそれぞれ、アイテムが追加されたときにそのコンテンツをアニメーション化し、各ContentControlは前のContentControlをオーバーレイします。ItemsControlおよびContentControlContentは、命名規則を使用してCaliburnMicroにバインドされます。

                    <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がItemsControlでホストされている場合の呼び出しの順序は、次のとおりです。

  1. OnContentChanged(アニメーションは失敗します)
  2. OnApplyTemplate
  3. MeasureOverride

ContentControlが単独で実行される場合、順序は次のとおりです。

  1. OnApplyTemplate
  2. MeasureOverride
  3. OnContentChanged(アニメーションは機能します)

ここでの問題は、ItemsControlの新しいItemの完全なビジュアルサブツリーが0(DesiredSize、ActualSize = 0)であるため、アニメーションコードが失敗することです。私はそれが誰かに何らかの意味があることを願っています、どんな助けも素晴らしいでしょう、Thx、J

- - - - - - - - - - - - - - - リビジョン - - - - - - - - - -

OK、OnLoadedイベントハンドラーをDummyControlのコンストラクターに追加しました。呼び出しの順序は1です。OnContentChanged(すべてのサイズは0)2. OnApplyTemplate(すべてのサイズは0)3. MeasureOverride(ContentControlによってホストされているすべての子コントロールに対しておそらく数回呼び出されます)4。Loadedイベント(必要なサイズはすべて設定されます)他のサイズはまだ0です)

誰かが、ItemsControlによってContentControlホステットをアニメーション化する方法について推奨される方法を説明できますか?

4

1 に答える 1

0

MeasureOverride()やその他のフックを呼び出さずに、XAMLですべてを実行し、アニメーションにそれを実行させます。

<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>
于 2012-03-29T16:12:38.280 に答える