有没有办法设置UIElement
的大小(不会转换为FrameworkElement
),可能类似于在RenderSize
镜像上使用UIElement
获取大小信息的方式通过ActualWidth
& ActualHeight
上的FrameworkElement
?
实际上,我猜你可以说我想设置 RenderSize
的{{1}}。
我正在思考一种方法的方法,这种方法可以某种方式使我能够强制测量/安排具有所需大小的传球,但似乎无法找到合适的攻击点。
答案 0 :(得分:1)
这似乎是一个简单或明显的答案,但不是,您不能仅仅因为它没有这些属性而设置Width
的{{1}}或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框架级别,有一个完整的布局系统可以呈现任何FrameworkElement派生类。 在WPF核心级别,将构建基于WPF的一般布局解决方案的某些成员已到位,但未定义布局系统的实际引擎。
我突出显示的粗体文字应该进一步解释为什么您无法设置UIElement
的{{1}}或Width
。
答案 1 :(得分:1)
最接近这种做法的方法是在Arrange(finalRect)
上致电UIElement
。 如果元素的ArrangeCore
覆盖(和/或后续OnRender
)实现“延伸”到/使用给定的整个区域(通过finalRect),其大小将被设置因此。但只有在。
就个人而言,我决定在其UI界面截断WPF并构建我自己的布局系统和一组完整的UI控件,这些控件直接从UIElement
下降。这样,我回避整个问题,因为我的层级中的爷爷,UIElement的长子,拥有从getgo内置的布局所需的所有成员 - 包括Width
和Height
的属性(因此基本上是一个相当大的UIElement
)。
我的其余代码只是处理爷爷,即我的“FrameworkElement”版本(这样更有效率 - 因为它消除了我不需要的所有上下文/依赖/样式功能等.WPF支付如此通用的代价。)
如果需要在布局中包含任何传统的FrameworkElementWrapper
,则该系列中会包含FrameworkElements
控件。