有没有办法设置UIElement的宽度和高度?

时间:2013-11-22 12:20:56

标签: c# wpf size uielement

有没有办法设置UIElement的大小(不会转换为FrameworkElement),可能类似于在RenderSize镜像上使用UIElement获取大小信息的方式通过ActualWidth& ActualHeight上的FrameworkElement

实际上,我猜你可以说我想设置 RenderSize的{​​{1}}。

我正在思考一种方法的方法,这种方法可以某种方式使我能够强制测量/安排具有所需大小的传球,但似乎无法找到合适的攻击点。

2 个答案:

答案 0 :(得分:1)

这似乎是一个简单或明显的答案,但不是,您不能仅仅因为它没有这些属性而设置Width的{​​{1}}或HeightUIElement类只是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内置的布局所需的所有成员 - 包括WidthHeight的属性(因此基本上是一个相当大的UIElement)。

我的其余代码只是处理爷爷,即我的“FrameworkElement”版本(这样更有效率 - 因为它消除了我不需要的所有上下文/依赖/样式功能等.WPF支付如此通用的代价。)

如果需要在布局中包含任何传统的FrameworkElementWrapper,则该系列中会包含FrameworkElements控件。