1

我想将 a 限制Grid.ColumnDefinition为最大宽度,但我不知道以编程方式执行此操作的宽度。考虑以下 XAML:

   <Grid MaxWidth="150" HorizontalAlignment="Left">
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="Auto" />
         <ColumnDefinition Width="Auto" />
      </Grid.ColumnDefinitions>
      
      <Grid.RowDefinitions>
         <RowDefinition Height="Auto" />
      </Grid.RowDefinitions>

      <TextBlock Grid.Column="0" Text="A" TextWrapping="Wrap" Background="LightGreen"  />
      <TextBlock Grid.Column="1" Text="B" TextWrapping="NoWrap" Background="LightSteelBlue" />      
   </Grid>

最多为 150 像素宽,Grid但可以更小。第TextBlock0 列中的Wrap. 第TextBlock1 列中的NoWrap. 为了清晰起见,添加了背景颜色。结果:

在此处输入图像描述

现在让我们更改文本:

      <TextBlock Grid.Column="0" Text="I'm long but I wrap" TextWrapping="Wrap" Background="LightGreen"  />
      <TextBlock Grid.Column="1" Text="I'm a long single line" TextWrapping="NoWrap" Background="LightSteelBlue" />      

结果:

在此处输入图像描述

可换行文本不换行。似乎没有提供Grid反馈TextBlock。我想要的行为是让Grid意识到它的列Auto已经扩展超过了它自己的MaxWidth属性并尝试缩小列中的内容。TextBlockthat isNoWrap不会遵守这个要求,而withTextBlockWrap。因此输出将是:

在此处输入图像描述

我想不出任何*调整大小的方法,因为我不希望网格占用这么多空间,除非需要内容。顺便说一句,实际Grid有许多潜在大小的列。这是一个简短的例子。

[编辑]:我的解决方案是一个 hack,我不在乎,但它有效。我在我的模型上创建了一个属性,该属性确定可以出现在其他列中的内容,包括图像、边距、文本等。然后它从网格大小中减去以找到设置了 Wrap 的 TextBlock 的最大宽度。工作得很好,但很丑。

4

1 回答 1

2

虽然 Auto 不适合您,但这样做*可以创造奇迹。除了对所有其他列视而不见*,您还可以执行 [a numeric value]*,就像Width="120*"分配 120 一样,但是,如果有更多空间,它将获得其余的。

现在,也就是说,如果您有一些您知道将被固定的列,例如某些始终为 100 宽度的日期字段,或某些 1 个字符的字符串类型类别,可能是 10 的固定宽度,但其余的则是灵活的。只需将它们混合在一起

Width 100
Width 10
Width 500*
Width 250*

因此,如果您的屏幕可用宽度为 1200,则第 1 列和第 2 列将保持其固定宽度。但是,500* 和 250* 将获得它们的基线宽度,然后在它们之间平均分配剩余的宽度。分割宽度的基于“*”的列越多,它们都会分割可用空间。

你试过做这样的事情吗?

于 2021-08-24T18:53:23.130 回答