XAML - 限制灵活网格中一个TextBlock的宽度,而不限制其他网格子项?

时间:2014-06-18 01:04:13

标签: wpf xaml textblock

我觉得有一个简单的解决方案,但我只是卡住了。

在XAML中,我有一个自动大小的网格,有几行,每行有一个TextBlock 我需要一个TextBlocks来限制它的宽度,这样它就不会拉伸Grid,而让其他的伸展并定义Grid的宽度(=整个Control的宽度)。
或者换句话说,将一个TextBlock Width(MaxWidth)设置为剩余TextBlocks中最宽的宽度。
当然受限制的TextBlock有一个文本Wrap,其他没有。

当我设置受限制的TextBlock Horizo​​ntalAlignment =“Left”(或其他任何东西,然后是Stretch)和TextWrapping =“Wrap”时,tblock仍然占用它所有的空间。

我不能简单地将tblock的Width绑定到其他元素Width,因为我需要最大的几个Width。

我能想到的唯一解决方案。
我可以从TextBlock派生,覆盖OnArrange,以某种方式获取其邻居tblock的大小并相应地设置其大小。
或者我可以创建一个转换器,并且基本上与多面板相似。

以为我好像用推土机杀死了一只蚊子,而我错过了一些简单的解决方案(?)

编辑:示例代码

<Grid x:Name="rootGrid" HorizontalAlignment="Center" VerticalAlignment="Center" MinWidth="64" MinHeight="64" >

    <Rectangle x:Name="bgRect" Fill="Gray" RadiusX="6" RadiusY="6" Margin="1" Grid.RowSpan="2" />

    <Grid x:Name="contentGrid" Grid.Row="1" Margin="8,0,8,6" >
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>

        <TextBlock x:Name="textName" Text="Gill Bates junior" FontWeight="Bold" FontSize="14" />

        <TextBlock x:Name="textDesc" TextWrapping="Wrap" Grid.Row="1" HorizontalAlignment="Left" 
                    Text="Test test test test Test test test test Test test test test Test test test test Test test test test Test test test test Test test test test " />
        <TextBlock x:Name="textDates" Text="1995 - 2075" Grid.Row="2" />
    </Grid>
</Grid>

1 个答案:

答案 0 :(得分:0)

我找到了一个简单的解决方案。 虽然它适用于这种情况,但我不确定它实际上是多么普遍可用或好一些。 无论如何,我将受限制的TBlock的宽度设置为1.它不应该是0,因为它的布局方法中的优化代码可能完全绕过它的一些布局步骤。
然后我将其MinWidth绑定到其父Grid的ActualWidth。由于TBlock doenst设置了任何边距,它给了我所需的宽度 令人惊讶的是它有效。

潜在问题:
我原本预计它可能会将布局系统抛入循环中。幸运的是,显然这样的案例在框架中得到了解决,所以事实并非如此。这并不意味着它发生在不同的星座中 为了帮助它,并帮助防止任何级联调整大小和重新布局,我将TBlock移动到XAML中Grid定义中的最后一个元素,因此它的布局过程被解析为Grid的所有元素。

我不确定这个循环依赖对布局传递的影响(并且不容易分析),但是它有效。