WPF C# Custom Control - Как заставить детей следовать строгим размерам (растянуть)

Я не уверен, как это сделать, но я создал пользовательскую панель FooPanel, Я хочу, чтобы моя FooPanel заставляла всех детей соответствовать размеру, заданному панелью (таким образом, они одинаковы). Я знаю о UniformGrid но у меня также есть кое-что еще.

Я не уверен, как заставить детей вписаться в коробку, которой я им говорю.


Child.xaml:

<Style TargetType="{x:Type l:FooChild}">
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />
    <Setter Property="Padding" Value="12,2,12,2" />
    <Setter Property="Foreground" Value="Black" />
    <Setter Property="Background" Value="White" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type l:FooChild}">
                <Border x:Name="ChromeBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                    <ContentPresenter ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                      HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
                                      VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
                                      />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

4 ответа

Решение

В вашей пользовательской панели вы можете только дать детям немного места. После этого это зависит от дочерних элементов, как выровнять себя в этом пространстве. Это поведение контролируется HorizontalAlignment/VerticalAlignment свойства FrameworkElement, Если оба эти свойства установлены в Stretch тогда элемент будет растягиваться, занимая все пространство, которое вы им дали внутри вашей панели.

Обновить:

В дополнение к HorizontalContentAllignment/VerticalContentAlignment установить HorizontalAlignment/VerticalAlignment свойства к Stretch в стиле FooChild элемент.

У меня была такая проблема только пару недель назад. Я исправил это так, но заметил, что это не самый предпочтительный метод.

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListBox.ItemContainerStyle>

Это для ListBox но я думаю, что это работает для любого ItemsControl.

Источник: еще один вопрос

Вы пытались установить HorizontalAlignment="Stretch" или HorizontalContentAlignment="Stretch" (и есть VertialAlignment)

Не могли бы вы предоставить XAML? Возможно, я смогу помочь тебе лучше.:)

Вы могли бы наполнить всех своих детей в DockPanel контроли, убедитесь, что они единственный ребенок, а затем установите LastChildFillсобственность на True,

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

Другие вопросы по тегам