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でホストされている場合の呼び出しの順序は、次のとおりです。
- OnContentChanged(アニメーションは失敗します)
- OnApplyTemplate
- MeasureOverride
ContentControlが単独で実行される場合、順序は次のとおりです。
- OnApplyTemplate
- MeasureOverride
- 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ホステットをアニメーション化する方法について推奨される方法を説明できますか?