使用“纯”xaml布局,是否可以告诉容器不要调整其大小?

时间:2013-03-17 13:16:27

标签: c# wpf xaml layout

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

  1. 我希望控件是它的父级和
  2. 的宽度
  3. 我不希望它影响其父级的宽度。
  4. 我知道我可以通过将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>
    

2 个答案:

答案 0 :(得分:1)

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

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

如果这就是你的意思。

答案 1 :(得分: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);
}