WPF - 获取UI元素在内存中的大小?

10

有没有一种方法可以获取在内存中但尚未呈现的UIElement的大小?

我目前有一个例程,它从DataTable创建Grid,然后将该网格添加到FixedDocument中。我需要知道Grid的大小,因为我想在需要时自动从纵向切换为横向; 或者甚至更改网格的FontSize

2个回答

23

你需要强制渲染该项,或者等待该项被渲染。然后你可以使用ActualHeightActualWidth属性。

要强制渲染:

  MenuItem item = new MenuItem();
  item.Header = "bling";
  item.Icon = someIcon;
  //Force render
  item.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
  item.Arrange(new Rect(item.DesiredSize));
在这个例子中,MenuItem 没有被赋予明确的高度或宽度。然而,强制渲染将考虑提供的标题文本和图标进行渲染。

“MenuItem” 对我没用,但是 “StackPanel” 或者 “Viewbox” 有用。 - vossad01
类'UIElement'上没有名为'ActualWidth'的属性 :-( - Boris
如果有很多面板被隐藏,偶尔复杂的控件可能无法正确呈现 - 这就是我不得不采取的解决方法:http://stackoverflow.com/questions/41966704/wpf-xaml-control-converted-to-an-image-has-incorrect-layout/41966743#41966743 - Simon_Weaver

1
只有在明确设置了WidthHeight时,才能确定这一点。即使如此,在某些情况下,它也可能会在渲染时发生变化,因为布局传递直到渲染时才会发生,并且ActualWidth/ActualHeight被设置。

那么我的唯一选择就是反复使用不同的字体大小和页面布局来渲染控件,直到它适合吗? - Sonny Boy
@Sonny:要么将其渲染到其他位置...你可以尝试使用RenderTargetBitmap等方法,在“屏幕外”渲染,然后再进行调整,这样用户就看不到它了... - Reed Copsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接