Silverlight 4.0 中的子类化 FrameworkElement - 测量通过问题
我目前在 Silverlight 中遇到一个问题,我想检测元素大小的变化并对其做出反应。但是,使用 .SizeChanged
进行侦听实际上是不够的,因为在调用 .SizeChanged
中的功能之前,我经常会看到元素正在更改的大小。所以我可能有两个问题。
我的目的是使用测量通道来计算我想要在尺寸发生视觉变化之前应用的操作,以便消除这种闪烁效果。据我所知,成功做到这一点的唯一方法是创建一个 UIElement,在测量其余元素之前在测量过程中执行这些计算。
因此,我希望通过扩展 FrameworkElement 来创建一个真正轻量级的 UIElement。 但是,我无法让这个愚蠢的东西显示任何东西。我的印象是,在 FrameworkElement 级别,子类需要将内容添加到 VisualTree,但我似乎不知道如何做到这一点。
我希望避免扩展 UserControl
或 Panel
,因为它们比我需要的要重得多,而且有很多我不想要的额外功能。我只想抓住测量通道并在那里执行一些工作。
那么,是否有可能在 Silverlight 4.0 中扩展 FrameworkElement
并实际渲染一些内容?如果没有,是否可以通过其他方式监听/中断测量传递?
I currently have an issue in Silverlight where I want to detect the change in size for an element, and react to it. However, listening with .SizeChanged
is actually not sufficient, as often I get a flash of the element at the size it's changing to, before the functionality in the .SizeChanged
is called. So I have perhaps a two-fold question.
My intention is to use the Measure pass to calculate the manipulations I want to apply before the size is visually changed, so that I can eliminate this flickering effect. As far as I'm aware, the only way to do this successfully is to create a UIElement that does these calculations on the Measure pass, before Measuring the rest of these elements.
As such, I was hoping to create a really light UIElement by extending off FrameworkElement. However, I can't get the stupid thing to display anything. I'm under the impression that at the FrameworkElement level, a subclass would require adding the content to the VisualTree and I can't seem to work out how to do that.
I was hoping to avoid extending off UserControl
, or Panel
, as they are far heavier than what I need, with so much extra functionality I dont want. I merely want to catch the Measure pass and perform some work there.
So, is it possible to extended off FrameworkElement
in Silverlight 4.0 and actually render something? If not, is it possible to listen for/interrupt the measure pass another way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您无法手动将内容添加到可视化树 - 此功能仅向内置 Silverlight 控件公开。
在这种情况下,您应该从
Control
派生并指定该控件要使用的默认模板 - 在默认模板中,指定可视化树的所需内容。要允许使用默认模板,您应该在构造函数中指定
DefaultStyleKey
并为其指定控件类型的值。例如DefaultStyleKey = GetType()
。然后,您可以在例如
Themes/Generic.xaml
中指定这样的样式,或者如果您的控件是内容呈现控件,则只需从
ContentControl
派生,并且它需要照顾所有的管道 - 您只需将Content
设置为您希望显示的任何内容,并且您的子类只需要执行测量传递覆盖逻辑。You cannot manually add content to the visual tree - this functionality is only exposed to built-in Silverlight controls.
In such a situation, you should derive from
Control
and specify a default template for this control to use - in the default template, specify the desired contents of the visual tree.To allow a default template to be used, you should specify
DefaultStyleKey
in your contructor and give it the value of your control type. E.g.DefaultStyleKey = GetType()
.Then, you can specify a style such as this, in e.g.
Themes/Generic.xaml
Or if your control is a content-presenting control, just derive from
ContentControl
and it takes care of all the plumbing - you just need to setContent
to whatever you wish to display and your subclass will only need to perform the measure-pass override logic.