ограничьте ширину StackPanel наименьшим дочерним элементом

StackOverflow https://stackoverflow.com/questions/377523

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Я надеюсь, что это поможет.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top