ограничить ширину StackPanel наименьшим дочерним элементом - PullRequest
0 голосов
/ 18 декабря 2008

Как я могу ограничить ширину вертикального WPF StackPanel самым узким элементом, который он содержит. Ширина StackPanel не должна превышать ширину любого другого дочернего элемента.

Ответы [ 3 ]

2 голосов
/ 18 декабря 2008

К сожалению, подход IValueConverter не всегда будет работать; например, если дочерние элементы добавляются в StackPanel статически, дочерняя коллекция будет пустой во время привязки (так я обнаружил). Самое простое решение - создать собственную панель:

public class ConstrainedStackPanel : StackPanel
{
    public ConstrainedStackPanel()
    {
    }

    protected override Size MeasureOverride(Size constraint)
    {
        foreach (var item in this.Children)
        {
            // FrameworkElement has the Width property we care about.
            FrameworkElement element = item as FrameworkElement;
            if (element != null)
                constraint.Width = Math.Min(element.Width, constraint.Width);
        }

        return base.MeasureOverride(constraint);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        foreach (var item in this.Children)
        {
            // FrameworkElement has the Width property we care about.
            FrameworkElement element = item as FrameworkElement;
            if (element != null)
                arrangeSize.Width = Math.Min(element.Width, arrangeSize.Width);
        }

        return base.ArrangeOverride(arrangeSize);
    }
}

Вы можете использовать панель, как показано на следующем XAML:

<StackPanel Margin="5">
    <TextBlock Text="StackPanel:" FontWeight="Bold" />
    <StackPanel x:Name="panelA">
        <Button Width="100" Content="100" />
        <Button Width="200" Content="200" />
        <Button Width="300" Content="300" />
        <Button Width="400" Content="400" />
    </StackPanel>
    <TextBlock Text="ConstrainedStackPanel:" FontWeight="Bold" Margin="0,10,0,0" />
    <l:ConstrainedStackPanel x:Name="panelB">
        <Button Width="100" Content="100" />
        <Button Width="200" Content="200" />
        <Button Width="300" Content="300" />
        <Button Width="400" Content="400" />
    </l:ConstrainedStackPanel>
</StackPanel>

Что будет отображать что-то вроде следующего:

ScreenShot

Надеюсь, это поможет.

1 голос
/ 02 февраля 2009

Я пытался привязать свойство ActualWidth, даже создавая конвертер для смещения значения, и это прекрасно работает за одним исключением: при увеличении размера контейнера ширина обновляется правильно, но когда создается контейнер Чем меньше, тем меньше ширина фактического контента, но «ширина страницы» у всех пользователей с прокруткой не будет. Я уверен, что есть способ обойти это, но я не нашел его.

1 голос
/ 18 декабря 2008

Вы не можете. Вертикально ориентированный StackPanel всегда выделяет столько ширины, сколько запрашивает его дочерний элемент.

Лучше всего написать собственную панель для достижения желаемого поведения.

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