Размер этикетки всегда NaN? - PullRequest
3 голосов
/ 28 мая 2010

У меня есть панель, которую я хочу расширить и переопределить MeassureOverride и Arrange, чтобы иметь свой собственный макет. В основном панель будет содержать несколько ярлыков. Поскольку метка имеет некоторое текстовое содержимое, она должна иметь определенный размер. Однако, когда я использую label.ActualHeight или actualwidth, requiredSize ... в MeassureOverride или ArrangeOverride, все приводит к NaN. Можно ли каким-либо образом получить желаемый размер метки, чтобы содержимое текста соответствовало требованиям

Ответы [ 2 ]

3 голосов
/ 28 мая 2010

Вы вызываете base.MeasureOverride (abailableSize) и base.ArrangeOverride (finalSize) в конце каждого метода?

Здесь - пример создания пользовательской панели

Пользовательская реализация MeasureOverride может выглядеть следующим образом (из поста):

protected override Size MeasureOverride(Size availableSize)
{
    Size sizeSoFar = new Size(0, 0);
    double maxWidth = 0.0;

    foreach (UIElement child in Children)
    {
        child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

        if (sizeSoFar.Width + child.DesiredSize.Width > availableSize.Width)
        {
            sizeSoFar.Height += child.DesiredSize.Height;
            sizeSoFar.Width = 0;
        }
        else
        {
            sizeSoFar.Width += child.DesiredSize.Width;
            maxWidth = Math.Max(sizeSoFar.Width, maxWidth);
        }
    }

    return new Size(maxWidth, sizeSoFar.Height);
}

Пользовательская реализация ArrangeOverride может выглядеть следующим образом (из поста):

protected override Size ArrangeOverride(Size finalSize)
{
    Size sizeSoFar = new Size(0, 0);

    foreach (UIElement child in Children)
    {
        child.Arrange(new Rect(sizeSoFar.Width, sizeSoFar.Height, 
                               child.DesiredSize.Width, child.DesiredSize.Height));

        if (sizeSoFar.Width + child.DesiredSize.Width >= finalSize.Width)
        {
            sizeSoFar.Height += child.DesiredSize.Height;
            sizeSoFar.Width = 0;
        }
        else
        {
            sizeSoFar.Width += child.DesiredSize.Width;
        }
    }

    return finalSize;
}

Если вы хотите включить рендеринг панели (вызвать функцию MeasureOverride), используйте функцию InvalidateMeasure

Вы также можете проверить Элементы пользовательских панелей в MSDN.

2 голосов
/ 28 мая 2010

DesiredSize для каждого ребенка устанавливается только после того, как вы его измерили. В вашем MeasureOverride вы должны позвонить child.Measure() для каждого из детей вашей панели. То же самое касается child.Arrange() в ArrangeOverride.

См. http://msdn.microsoft.com/en-us/library/ms745058.aspx#LayoutSystem_Measure_Arrange

Отредактируйте в ответ на ваш комментарий: просто передайте максимальный размер вашего ярлыка (доступный размер) или ограниченный размер, если вам нужно. После измерения метка будет использовать свой минимальный размер как DesiredSize, если выравнивания отличаются от растяжения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...