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 для всех ваших дочерних элементов и заставить их всех расширяться до максимального доступного им пространства.