我喜欢使用ItemsControl来托管ContentsControls。每个新的ContentsControl都会在添加项目时为其内容设置动画,并且每个ContentControl都会覆盖前一个ContentControl。 ItemsControl和ContentControl内容使用命名约定与Caliburn Micro绑定。
<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中托管ContentControl时的调用顺序是:
当ContentControl自行运行时,订单为:
这里的问题是ItemsControl中新Item的完整视觉子树是0(DesiredSize,ActualSize = 0),因此我的动画代码失败了。 我希望这对某人有意义, 任何帮助都会很棒,Thx,J
------------------------------修订---------------- ---
好的,我将OnLoaded事件处理程序添加到DummyControl的ctor中。 calles的顺序是 1. OnContentChanged(所有大小均为0) 2. OnApplyTemplate(所有大小均为0) 3. MeasureOverride(可能由ContentControl为所有子控件hostet调用几次) 4.已加载事件(所需大小设置为所有其他大小仍为0)
可以用sombody解释推荐的如何动画ContentControl的做法 通过ItemsControl的hostet?
答案 0 :(得分: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>