WPF - 如何获取ContentControl内容的ActualHeight?

时间:2013-08-27 18:51:46

标签: wpf animation

以下是一些代码:

<components:AnimatedContentControl x:Name="MainContent" Content="{Binding}">
    <components:AnimatedContentControl.Triggers>
        <EventTrigger RoutedEvent="components:AnimatedContentControl.ContentChanged">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                         Storyboard.TargetName="MainContent"
                         Storyboard.TargetProperty="Height"
                         Duration="0:0:0.25"
                         From="0"
                         To="{Binding ElementName=MainContent, Path=ActualHeight}" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </components:AnimatedContentControl.Triggers>
</components:AnimatedContentControl>

AnimatedContentControl是我创建的一个类,它基于一个ContentControl,里面有一个ContentChanged路由事件(因为无论出于何种原因,ContentControl没有{默认情况下为{1}}事件。

此代码中的目标是将我的应用程序ContentChanged指向的任何内容加载到此DataContext中,并在更改数据上下文时显示由幻灯片组成的简单动画从零到新内容的大小(理想情况下,它会从旧内容的高度滑动到新内容的高度,但首先是第一步)。对于这样一个简单的想法,这一点非常难以发展。

我已经知道我的问题是什么:当此事件触发时,ContentControl的{​​{1}}属性已更新,但出于某种原因,Content AnimatedContentControl没有(实际上,想到它,我可以使用ActualSize属性AnimatedContentControl的{​​{1}}属性 - 稍后我会尝试。

所以我的问题是:我可以在ActualSize中绑定哪些内容,From内容的实际大小?如果是这样,它是什么?如果没有,那里有哪些解决方案?

1 个答案:

答案 0 :(得分:0)

鲍里斯是对的 - 我的代码现在看起来像这样:

<components:AnimateableContentControl x:Name="MainContent" Content="{Binding}">
    <components:AnimateableContentControl.Triggers>
        <EventTrigger RoutedEvent="components:AnimateableContentControl.ContentChanged">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                        x:Name="TransitionAnimation"
                        Storyboard.TargetName="MainContent"
                        Storyboard.TargetProperty="Height"
                        Duration="0:0:0.25"
                        From="0"
                        To="0" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </components:AnimateableContentControl.Triggers>
</components:AnimateableContentControl>

...我改变DataContext s(导致动画)的地方,我有这个:

DataTemplate template = Resources[new DataTemplateKey(m_currentViewModel.GetType())] as DataTemplate;

if (template == null)
{
    DataContext = m_currentViewModel;
    return;
}

FrameworkElement element = template.LoadContent() as FrameworkElement;

if (element == null)
{
    DataContext = m_currentViewModel;
    return;
}

element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

TransitionAnimation.To = element.DesiredSize.Height;

DataContext = m_currentViewModel;

像魅力一样!谢谢,鲍里斯!