我目前在Silverlight中遇到问题,我想检测元素的大小变化,并对其做出反应。但是,使用.SizeChanged
进行监听实际上是不够的,因为在调用.SizeChanged
中的功能之前,我经常会以其更改的大小获得元素的闪存。所以我可能有一个双重问题。
我的目的是在视觉上改变大小之前使用Measure pass来计算我想要应用的操作,这样我就可以消除这种闪烁效应。据我所知,成功完成此操作的唯一方法是在测量其余元素之前创建一个UIElement,在Measure传递上执行这些计算。
因此,我希望通过扩展FrameworkElement来创建一个非常简单的UIElement。 然而,我无法显示任何愚蠢的东西。我的印象是,在FrameworkElement级别,子类需要将内容添加到VisualTree中,我似乎无法弄清楚如何做到这一点。
我希望避免延长UserControl
或Panel
,因为它们比我需要的更重,因为我不想要这么多额外的功能。我只想抓住测量通过并在那里完成一些工作。
那么,是否可以在Silverlight 4.0中延长FrameworkElement
并实际渲染?如果没有,是否可以通过另一种方式监听/中断该措施?
答案 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覆盖逻辑。