我有一个列表框,其中包含大小未知的任意数量的UIElement
。
我希望能够在添加每个项目后跟踪列表框的建议大小。这将允许我将大型列表(例如:100个项目)拆分为几个(例如:10个)大致相同的 视觉 大小的小型列表,无论视觉大小如何列表中的每个元素。
但是,在第一次调用Measure时,测量通道似乎只影响ListBox
的{{1}}属性:
DesiredSize
我试过添加一个调用:
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
ListBox listBox = new ListBox();
this.Content = listBox;
// Add the first item
listBox.Items.Add("a"); // Add an item (this may be a UIElement of random height)
listBox.Measure(new Size(double.MaxValue, double.MaxValue)); // Measure the list box after the item has been added
Size size1 = listBox.DesiredSize; // reference to the size the ListBox "wants"
// Add the second item
listBox.Items.Add("b"); // Add an item (this may be a UIElement of random height)
listBox.Measure(new Size(double.MaxValue, double.MaxValue)); // Measure the list box after the item has been added
Size size2 = listBox.DesiredSize; // reference to the size the ListBox "wants"
// The two heights should have roughly a 1:2 ratio (width should be about the same)
if (size1.Width == size2.Width && size1.Height == size2.Height)
throw new ApplicationException("DesiredSize not updated");
}
}
在添加项目之间无济于事。
是否有一种简单的方法可以在添加项目时计算listBox.InvalidateMeasure();
(或任何ListBox
)的所需大小?
答案 0 :(得分:3)
如果将相同的大小传递给Measure方法,测量阶段会有一些优化可以“重复使用”之前的测量。
您可以尝试使用不同的值来确保真正重新计算测量值,如下所示:
// Add the second item
listBox.Items.Add("b"); // Add an item (this may be a UIElement of random height)
listBox.Measure(new Size(1, 1));
listBox.Measure(new Size(double.MaxValue, double.MaxValue));