Silverlight 4.0中的子类化FrameworkElement - 度量通过问题

时间:2011-05-23 09:22:20

标签: c# silverlight silverlight-4.0 measureoverride frameworkelement

我目前在Silverlight中遇到问题,我想检测元素的大小变化,并对其做出反应。但是,使用.SizeChanged进行监听实际上是不够的,因为在调用.SizeChanged中的功能之前,我经常会以其更改的大小获得元素的闪存。所以我可能有一个双重问题。

我的目的是在视觉上改变大小之前使用Measure pass来计算我想要应用的操作,这样我就可以消除这种闪烁效应。据我所知,成功完成此操作的唯一方法是在测量其余元素之前创建一个UIElement,在Measure传递上执行这些计算。

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

我希望避免延长UserControlPanel,因为它们比我需要的更重,因为我不想要这么多额外的功能。我只想抓住测量通过并在那里完成一些工作。

那么,是否可以在Silverlight 4.0中延长FrameworkElement实际渲染?如果没有,是否可以通过另一种方式监听/中断该措施?

1 个答案:

答案 0 :(得分:1)

您无法手动将内容添加到可视树中 - 此功能仅暴露给内置的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设置为您希望显示的内容和子类只需要执行measure-pass覆盖逻辑。