Silverlight 4.0中的FrameworkElement子类-一个度量合格问题

本文关键字:一个 度量 问题 中的 FrameworkElement 子类 Silverlight | 更新日期: 2023-09-27 17:57:29

我目前在Silverlight中遇到一个问题,我想检测元素大小的变化,并对其做出反应。然而,使用.SizeChanged进行侦听实际上是不够的,因为在调用.SizeChanged中的功能之前,我经常会看到元素变大时的闪光。所以我可能有两个问题。

我的意图是使用Measure过程来计算我想要在视觉上更改大小之前应用的操作,这样我就可以消除这种闪烁效果。据我所知,成功做到这一点的唯一方法是在测量其余元素之前,创建一个UIElement,在Measure过程中进行这些计算。

因此,我希望通过扩展FrameworkElement来创建一个非常轻的UIElement然而,我不能让这个愚蠢的东西显示任何东西。我的印象是,在FrameworkElement级别,子类需要将内容添加到VisualTree中,而我似乎不知道如何做到这一点。

我希望避免扩展UserControlPanel,因为它们比我需要的要重得多,而且有太多我不想要的额外功能。我只是想抓住Measure通行证,在那里做一些工作。

那么,是否有可能在Silverlight 4.0中扩展FrameworkElement,并且实际呈现一些?如果没有,是否可以通过另一种方式监听/中断测量传递?

Silverlight 4.0中的FrameworkElement子类-一个度量合格问题

您不能手动将内容添加到可视化树中-此功能仅对内置的Silverlight控件公开。

在这种情况下,您应该从Control派生,并为该控件指定一个要使用的默认模板——在默认模板中,指定可视化树的所需内容。

为了允许使用默认模板,您应该在构造函数中指定DefaultStyleKey,并为其提供控件类型的值。例如DefaultStyleKey = GetType()

然后,您可以在例如Themes/Generic.xaml 中指定这样的样式

<Style TargetType="my:MyControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="my:MyControl">
                <Rectangle Width="100" Height="100" Fill="Red" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

或者,如果您的控件是一个内容呈现控件,只需从ContentControl派生,它就可以处理所有管道——您只需要将Content设置为您想要显示的任何内容,并且您的子类只需要执行度量传递覆盖逻辑。