【问题标题】:WPF C# Custom Control -- How to get children to follow a strict size (stretch out)WPF C# 自定义控件——如何让孩子遵循严格的尺寸(伸展)
【发布时间】:2024-01-09 08:01:01
【问题描述】:

我不知道该怎么做,但我创建了一个自定义面板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>

【问题讨论】:

    标签: wpf custom-controls panel children measureoverride


    【解决方案1】:

    在您的自定义面板中,您只能给孩子一些空间。之后,取决于子元素如何在该空间中对齐。此行为由FrameworkElementHorizontalAlignment/VerticalAlignment 属性控制。如果这两个属性都设置为Stretch,则元素将拉伸,占用您在面板内为它们提供的所有空间。

    更新:

    除了HorizontalContentAllignment/VerticalContentAlignment 之外,将HorizontalAlignment/VerticalAlignment 属性设置为Stretch,采用FooChild 元素的样式。

    【讨论】:

    • 啊,所以只需将我希望它们符合的尺寸传递给它们,然后让它们伸进去?
    【解决方案2】:

    几周前我遇到过这样的问题。 我是这样修复的,但我注意到这不是首选方法。

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

    这是为 ListBox 准备的,但我想它适用于任何 ItemsControl。

    来源:another SO question

    【讨论】:

      【解决方案3】:

      您可以将所有孩子塞入DockPanel 控件中,确保他们是唯一的孩子,然后将LastChildFillproperty 设置为True

      或者,您可以覆盖您所有孩子的MeasureOverride property,并强制他们全部扩展到他们可用的最大空间量。

      【讨论】:

      • 我无法使用 DockPanel,因为我正在创建自定义面板。我意识到还有其他面板接近我想要的,但它们并不是我想要的,这就是我选择使用自定义面板的原因。恰好是我的自定义面板的一部分要求所有子级都具有相同的大小。如果可以的话,我会改用UniformGrid,但它并不能完全满足我的需要。虽然很近...
      【解决方案4】:

      您是否尝试设置 Horizo​​ntalAlignment="Stretch" 或 Horizo​​ntalContentAlignment="Stretch"(并且有一个 VertialAlignment)

      你能提供一些 xaml 吗?我也许能以这种方式更好地帮助你。 :)

      【讨论】: