2012-02-25 3 views
1

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에에서 호스팅되는 호출의 순서는 다음과 같습니다

  1. OnContentChanged (애니메이션도 실패한)
  2. OnApplyTemplate
  3. 의 MesureOverride

ContentControl에이 순서는 그 자체로 실행하면 :

  1. onApplytemplate
  2. MeasureOverride 함수
  3. 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 호스트 세트를 애니메이션으로 만드는 방법에 대한 권장 사항은 무엇인지 설명 할 수 있습니까?

+0

애니메이션을 처리하기 전에 더미 컨트롤이로드되었는지 확인 했습니까? 로드되지 않은 경우 애니메이션을 연기해야합니다. – BladeWise

답변

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> 
관련 문제