如何覆盖MeasureOverride以查找ItemsControl的大小

我正在开发一个UserControl,它包含一个带有标题和项目列表的块(作为ItemsControl )。 usercontrol动态添加到canvas。 我需要在渲染之前获取控件的实际大小(包括ItemsControl占用的空间)。 我尝试重写UserControl的MeasureOverride方法,希望大小将反映在DesiredSize属性中。 但它没有用。

XAML是:

                                     

我正在覆盖UserControl的MeasureOverride,如下所示:

  namespace MyTools { public partial class MyControl : UserControl { public MyControl() { InitializeComponent(); } public string ControlName { get; set; } public object MyItems { get; set; } public class Row { public string MyVal { get; set; } } protected override Size MeasureOverride(Size availableSize) { var desiredSize = base.MeasureOverride(availableSize); var sideLength = Math.Min(desiredSize.Width, desiredSize.Height); desiredSize.Width = sideLength; desiredSize.Height = sideLength; return desiredSize; } } } 

客户代码:

  MyControl control1 = new MyControl(); control1.ControlName = "Test Name"; var test = new List( new MyControl.Row[] { new MyControl.Row {MyVal = "Item1"}, new MyControl.Row {MyVal = "Item2"}, new MyControl.Row {MyVal = "Item3"} }); control1.MyItems = test; control1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); MessageBox.Show(control1.DesiredSize.Height.ToString()); canvas1.Children.Add(control1); 

我没有使用客户端的DesiredSize.Height属性获取实际大小。 有关如何解决此问题的任何想法?

您的用户控件是否定义为更改高度以反映内容的大小? 默认情况下,您的用户控件将是固定大小,并且不会因为items控件具有更多条目而更改高度。

我认为您需要在网格中添加用户控件,然后再测量网格。 这就是我测量控件的方式,它似乎运行良好,即使直接测量控件不能像你的情况一样工作……

 MyControl control1 = new MyControl(); ... your setup code for control1... Dim containerGrid As New Grid containerGrid.Children.Add(control1) containerGrid.Measure(New Size(Double.MaxValue, Double.MaxValue)) containerGrid.Arrange(New Rect(0, 0, Double.MaxValue, Double.MaxValue)) ...now check the grid.ActualWidth and grid.ActualHeight 

尝试使用ActualWidthActualHeight属性。

 protected override Size MeasureOverride(Size availableSize) { var desiredSize = new Size(); var sideLength = Math.Min(ActualWidth, ActualHeight); desiredSize.Width = sideLength; desiredSize.Height = sideLength; return desiredSize; }