Как сбросить DesiredSize для элемента UIElement - PullRequest
4 голосов
/ 20 мая 2011

У меня есть список, который содержит любое количество UIElement s, размер которых неизвестен.

Я хочу иметь возможность отслеживать предлагаемый размер списка после добавления каждого элемента.Это позволит мне разбить большой список (например, 100 элементов) на несколько (например, 10) небольших списков примерно одинакового размера визуальный независимо от визуального размера каждого из них.элемент в списке.

Однако, похоже, что проход Measure влияет только на свойство ListBox DesiredSize при первом вызове Measure:

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 (или любого ItemsControl)в то время, когда элементы добавляются?

1 Ответ

3 голосов
/ 20 мая 2011

Существуют некоторые оптимизации в фазе измерения, которые "повторно" используют предыдущие измерения, если тот же размер передается методу измерения.

Вы можете попробовать использовать разные значения, чтобы убедиться, что измерение действительно пересчитано, например:

// 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));
...