2012-02-25 16 views
1

ItemsControlを使用してContentsControlをホストするのが好きです。それぞれの新しいContentsControlは、アイテムが追加され、それぞれの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

  1. (アニメーションfailes)
  2. OnApplyTemplate
  3. MeasureOverride

ContentControlには、順序はそれ自体で実行されます。

  1. オンアプライテンプレート
  2. MeasureOverride
  3. OnContentChanged(アニメーション作品)

ここでの問題は、ItemsControlの中に新しい項目の完全な視覚的な部分木が0であること(DesiredSizeを、ActualSize = 0)ので、私のアニメーションのコードが失敗しています。 誰かに何か意味があることを願っています。 何か助けがあれば、Thx、J

-------------------------- ---- Revision -------------------

私はOnLoadedイベントハンドラをDummyControlのctorに追加しました。 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> 
関連する問題