2

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

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

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

我希望避免扩展UserControl,或者Panel,因为它们比我需要的要重得多,所以有很多我不想要的额外功能。我只想赶上 Measure 通过并在那里执行一些工作。

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

4

1 回答 1

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为您希望显示的任何内容,您的子类只需要执行测量传递覆盖逻辑。

于 2011-05-23T10:06:42.123 回答