是否有一种方法可以设置UIElement的大小(而不强制转换为FrameworkElement),可能类似于在UIElement上使用RenderSize镜像通过FrameworkElement上的ActualWidth和ActualHeight获取大小信息的方式?实际上,我猜您可以说我想设置UIElement的RenderSize。我正在沿着一种方法,该方法将以某种方式使我能够强制一个具有所需大小的测量/排列通道,但似乎无法找到一个适当的攻击点。
UIElement
FrameworkElement
RenderSize
ActualWidth
ActualHeight
3bygqnnd1#
最接近的方法是在UIElement上调用Arrange(finalRect)。如果元素的ArrangeCore覆盖(和/或后续的OnRender)实现“延伸”到/利用整个给定区域(由finalRect),则其大小将相应地设置。就我个人而言,我决定从WPF的UI瓶颈处将其截断,并构建自己的布局系统和一整套直接源自UIElement的UI控件。这样,我就避开了整个问题,因为我的祖父,UIElement的长子,具有从getgo内置的布局所需的所有成员-包括Width和Height的属性(因此基本上是一个相当大的UIElement)。然后,我的代码的其余部分只处理爷爷,即我的“FrameworkElement”版本(这是更有效的方式-因为它摆脱了所有的上下文/依赖关系/样式功能等,我无论如何都不需要。WPF为如此通用付出了代价)。FrameworkElementWrapper控件包含在该系列中,如果需要在布局中包含任何传统的FrameworkElements。
Arrange(finalRect)
ArrangeCore
OnRender
Width
Height
FrameworkElementWrapper
FrameworkElements
f1tvaqid2#
在2023年,现在我们有SetValue()的UIElement。所以它可以间接地设置一些属性。例如,要设置UIElement的高度(不强制转换)。您可以使用以下代码
SetValue()
uIElement.SetValue(Shape.HeightProperty, 300.0);
在SetValue()中找到所有相关属性有点困难,但这是可能的。
7jmck4yq3#
这看起来似乎是一个简单或显而易见的答案,但事实并非如此,您不能仅仅因为x1m2 n1,不具有这些属性就设置Width或Height。UIElement类只是提供一些基本功能的 * WPF核心级实现的基类 *。来自MSDN上的UIElement Class:UIElement具有以下由UIElement类专门定义的功能:·可以作为子元素呈现(UIElement派生自Visual,一个高级图形类)·包含用于调整UIElement的可能子元素的大小和位置的逻辑(由布局系统解释时)·可以响应用户输入(包括通过处理事件路由或命令路由来控制将输入发送到何处)·可以引发在逻辑元素树中沿路径行进的路由事件·支持动画系统的某些方面现在,当查看MSDN上的FrameworkElement Class页面时,我们看到:FrameworkElement扩展了UIElement并添加了以下功能:·布局系统定义:FrameworkElement为在UIElement中定义为虚拟成员的某些方法提供特定的WPF框架级别实现。最值得注意的是,FrameworkElement密封了某些WPF核心级别布局重写,而是提供派生类应该重写的WPF框架级别等效项。例如,FrameworkElement密封ArrangeCore但提供ArrangeOverride。这些更改反映了以下事实:在WPF框架中-在WPF核心级别上,将有一个完整的布局系统,可以呈现任何FrameworkElement派生类。在WPF核心级别上,将构成基于WPF的常规布局解决方案的某些成员已就位,但布局系统的实际引擎尚未定义。我突出显示的粗体文本应该进一步解释了为什么不能设置UIElement的Width或Height。
3条答案
按热度按时间3bygqnnd1#
最接近的方法是在
UIElement
上调用Arrange(finalRect)
。如果元素的ArrangeCore
覆盖(和/或后续的OnRender
)实现“延伸”到/利用整个给定区域(由finalRect),则其大小将相应地设置。就我个人而言,我决定从WPF的UI瓶颈处将其截断,并构建自己的布局系统和一整套直接源自
UIElement
的UI控件。这样,我就避开了整个问题,因为我的祖父,UIElement的长子,具有从getgo内置的布局所需的所有成员-包括Width
和Height
的属性(因此基本上是一个相当大的UIElement
)。然后,我的代码的其余部分只处理爷爷,即我的“FrameworkElement”版本(这是更有效的方式-因为它摆脱了所有的上下文/依赖关系/样式功能等,我无论如何都不需要。WPF为如此通用付出了代价)。
FrameworkElementWrapper
控件包含在该系列中,如果需要在布局中包含任何传统的FrameworkElements
。f1tvaqid2#
在2023年,现在我们有
SetValue()
的UIElement
。所以它可以间接地设置一些属性。例如,要设置UIElement
的高度(不强制转换)。您可以使用以下代码在
SetValue()
中找到所有相关属性有点困难,但这是可能的。7jmck4yq3#
这看起来似乎是一个简单或显而易见的答案,但事实并非如此,您不能仅仅因为x1m2 n1,不具有这些属性就设置
Width
或Height
。UIElement
类只是提供一些基本功能的 * WPF核心级实现的基类 *。来自MSDN上的UIElement
Class:UIElement具有以下由UIElement类专门定义的功能:
·可以作为子元素呈现(UIElement派生自Visual,一个高级图形类)
·包含用于调整UIElement的可能子元素的大小和位置的逻辑(由布局系统解释时)
·可以响应用户输入(包括通过处理事件路由或命令路由来控制将输入发送到何处)
·可以引发在逻辑元素树中沿路径行进的路由事件
·支持动画系统的某些方面
现在,当查看MSDN上的
FrameworkElement
Class页面时,我们看到:FrameworkElement扩展了UIElement并添加了以下功能:
·布局系统定义:FrameworkElement为在UIElement中定义为虚拟成员的某些方法提供特定的WPF框架级别实现。最值得注意的是,FrameworkElement密封了某些WPF核心级别布局重写,而是提供派生类应该重写的WPF框架级别等效项。例如,FrameworkElement密封ArrangeCore但提供ArrangeOverride。这些更改反映了以下事实:在WPF框架中-在WPF核心级别上,将有一个完整的布局系统,可以呈现任何FrameworkElement派生类。在WPF核心级别上,将构成基于WPF的常规布局解决方案的某些成员已就位,但布局系统的实际引擎尚未定义。
我突出显示的粗体文本应该进一步解释了为什么不能设置
UIElement
的Width
或Height
。