ItemsControl을 사용하여 ContentsControl을 호스팅하는 것을 좋아합니다. 각 새로운 ContentControl은 항목이 추가되고 각 ContentControl이 이전 항목을 오버레이 할 때 해당 내용을 애니메이션으로 나타냅니다. ItemsControl 및 ContentControl 내용은 명명 규칙을 사용하여 Caliburn Micro와 바인딩됩니다.ItemsControl에서 ContentControl을 애니메이트하는 방법
<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
- 의 MesureOverride
ContentControl에이 순서는 그 자체로 실행하면 :
- onApplytemplate
- MeasureOverride 함수
- OnContentChanged (애니메이션 작품)
여기서 문제는 ItemsControl에 새로운 항목의 전체 시각적 하위 트리가 0입니다 (DesiredSize를, ActualSize = 0) 그러므로 내 애니메이션 코드가 실패합니다. 누군가에게 이해가되기를 바랍니다. 도움이 될 것입니다. Thx, J
-------------------------- ---- Revision -------------------
나는 DummyControl의 ctor에 OnLoaded 이벤트 핸들러를 추가했습니다. 호출 순서는 입니다. 1. OnContentChanged (모든 크기는 0) 2. OnApplyTemplate (모든 크기는 0) 3. MeasureOverride (ContentControl에서 모든 하위 컨트롤 호스트에 대해 아마 여러 번 호출 됨) 4.로드 된 이벤트 (원하는 경우 크기가 여전히 설정되어 있습니다. 다른 모든 크기는 여전히 0입니다.
ItemsControl에서 ContentControl 호스트 세트를 애니메이션으로 만드는 방법에 대한 권장 사항은 무엇인지 설명 할 수 있습니까?
애니메이션을 처리하기 전에 더미 컨트롤이로드되었는지 확인 했습니까? 로드되지 않은 경우 애니메이션을 연기해야합니다. – BladeWise