在渲染前获取UserControl的实际大小

本文关键字:UserControl 获取 | 更新日期: 2023-09-27 18:18:56

我试图获得MyUserControl的ActualSize,然后使用UserControl类的Measure方法渲染,如我之前的问题所建议的。然而,它不起作用。MyUserControl有一个ItemsControl,它与List绑定,如下所示。通过uc.MyCollection = myCollection;添加的项目没有在uc.DesiredSize.Height中得到反映。

MyUserControl uc= new MyUserControl();
uc.AName = "a1";
uc.Width = 194;
uc.MyCollection = myCollection; //myCollection is  a List databound to ItemsControl inside MyUserControl
uc.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
uc.Arrange(new Rect(0, 0, uc.DesiredSize.Width, uc.DesiredSize.Width)); //Needed?
uc.UCHeight = uc.DesiredSize.Height; //size of items databound to ItemsControl not reflected here
uc.UCWidth = uc.DesiredSize.Width;
uc.Margin = new Thickness(34, 42, 0, 0);
myRoot.Children.Add(uc); //myRoot is Canvas

在渲染前获取UserControl的实际大小

你必须在你的uc中重写MeasureOverride和ArrangeOverride来计算你自己的大小。在MeasureOverride"问"你的列表与"Measure"自己的大小-所以你可以计算大小为你自己的uc(在MeasureOverride返回这个大小)-然后你得到你的DesiredSize后调用uc.Measure.

您的ItemsControl绑定到MyCollection将不会处理,直到您的用户控件在VisualTree中,所以在您调用Measure时,所需的大小仍然是0。

当我需要获取FrameworkElement的大小时,我将其不透明度设置为0,将其添加到可视树中,并等待sizechange事件

参见https://msdn.microsoft.com/en-us/library/6xe5hazb(v=vs.110).aspx在示例中,参数"byval e as PaintEventArgs"不需要。为了只检索显示整个字符串所需的大小,您可以在子例程MeasureStringMin中创建自己的paintEventArgs字段。