0

我有一个非常广泛的 XAML 控件。它会影响其父级的大小,因此我不希望它改变布局。我不介意控件是否会被剪裁,或者其他什么 - 但我想要以下内容:

  1. 我希望控件是其父级的宽度,并且
  2. 我不希望它以其他方式影响其父级的宽度。

我知道我可以通过将 Width 绑定到我感兴趣的父控件的 ActualWidth 来实现这一点。但是,是否有一些面板或其他东西会从其父控件中获取其大小而忽略它的子控件。

因为这是在具有星形列的 Grid 内,所以将其放在 ScrollViewer 内无济于事 - ScrollViewer 仍会增长以填充网格。

在下面的示例中,我希望按钮控制中间列的宽度,文本块最多占用 Button 的空间量:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Button Content="asdsadsad" Grid.Row="1" Grid.Column="1"/>
    <TextBlock IsHitTestVisible="True" Opacity="0" Grid.Row="1" Grid.Column="1" Text="sdfsdfdsfdfhfkjahslkjfhsafhsakjhflkjsahflkjsahdflkjhsadfsdfkgljdsfkgjfdsjgdshf" />
</Grid>
4

2 回答 2

1

您可以将 TextBlock 放在 Canvas 中,然后将画布剪辑到其边界:

    <Canvas Grid.Row="1" Grid.Column="1" ClipToBounds="True">
        <TextBlock IsHitTestVisible="True" Opacity="0.5" Text="sdfsdfdsfdfhfkjahslkjfhsafhsakjhflkjsahflkjsahdflkjhsadfsdfkgljdsfkgjfdsjgdshf" />
    </Canvas>

如果这就是你的意思。

于 2013-03-17T13:36:58.247 回答
0

我看到你已经接受了另一个答案,但如果你只是指文本块,你不能只使用 TextTrimming 吗?

如果不是这种情况,一个简单的 Panel 子类会比画布更好,因为您可以在确定所需大小时显式忽略孩子的大小。你仍然需要测量孩子。在 MeasureOverride 中确定面板的大小时,您只需忽略它们的“DesiredSize”。然后在 ArangeOverride 中,它将遵循您在 MeasureOverride 中指定的最大尺寸。

这样做的好处是文本框或任何与此相关的控件仍然可以像孩子一样正确调整大小和布局,但它们永远不会影响面板的大小。

这是您需要的 MeasureOverride 代码。然后在 ArrangeOverride 中,您只需根据需要布置子项,决定在您认为合适的情况下考虑剪裁或约束到面板。(自定义面板是我最喜欢的 WPF 之一。)

protected override Size MeasureOverride(Size availableSize)
{
    // You still measure the children.  You just don't use them when determining the size of the panel.
    foreach(FrameworkElement childElement in this.Children)
    {
        if(childElement.Visibility != Visibility.Collapsed)
            childElement.Measure(availableSize);
    }

    return new Size(
        Double.IsPositiveInfinity(availableSize.Width)  ? 0 : availableSize.Width,
        Double.IsPositiveInfinity(availableSize.Height) ? 0 : availableSize.Height);
}
于 2013-04-04T11:08:31.577 回答