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

时间:2011-12-29 08:24:54

标签: c# silverlight

我尝试使用MyUserControl类的Measure方法呈现UserControl之前的MyUserControl的ActualSize,如我previous question所建议的那样。但它不起作用。 ItemsControl的{​​{1}}数据绑定为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

3 个答案:

答案 0 :(得分:6)

你必须在你的uc中覆盖MeasureOverride和ArrangeOverride来计算你自己的大小。在MeasureOverride里面用你自己大小的“测量”“询问”你的列表 - 所以你可以计算你自己的uc的大小(在MeasureOverride中返回这个大小) - 然后你在调用uc.Measure后获得你的DesiredSize。

答案 1 :(得分:1)

您的ItemsControl绑定到MyCollection将不会处理,直到您的用户控件在VisualTree中,所以在您调用Measure时,desiredsize仍为0.

当我需要获得FrameworkElement的大小时,我将它的Opacity设置为0,将其添加到可视树中,然后等待SizeChanged事件。

答案 2 :(得分:0)

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