ScrollViewer和TextBlock包装

Gor*_*ran 3 wpf wpf-4.0

我有以下布局(简化):

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition MaxWidth="400" />
    <ColumnDefinition />
  </Grid.ColumnDefinitions>

  <!-- Code for Column=0 -->

  <ScrollViewer Grid.Column="1">
    <Grid x:Name="layoutGrid">

      <Grid.ColumnDefinitions>
        <Grid.ColumnDefinition Width="Auto" />
        <Grid.ColumnDefinition MinWidth="100" MaxWidth="400" />
        <Grid.ColumnDefinition Width="Auto" />
      </Grid.ColumnDefinitions>

      <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
      </Grid.RowDefinitions>


      <!-- Code for Row=0 and Row=1 -->

      <GroupBox Grid.ColumnSpan="3" Grid.Row=2>
        <TextBlock Text="{Binding ...}" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Top" />
      </GroupBox>
    </Grid>
  </ScrollViewer>
</Grid>
Run Code Online (Sandbox Code Playgroud)
  • 第一列应该占据所需的空间(有时它可以是100像素,有时是500).
  • 第二列应伸展到可用空间,但不超过400像素(变得难看).
  • 第三列应尽可能多地占用空间(有时可以是200像素,有时是400像素).
  • 如果在极少数情况下,layoutGrid需要的空间超过屏幕上的可用空间,则应该可以看到水平滚动条.
  • GroupBox应该始终具有所有三列的总宽度(它应该尽可能多地扩展它们的宽度).在那个空间里,文本框应该换行.GroupBox不应该伸展到屏幕上可用的整个空间.

我怎样才能在xaml中实现这一目标?似乎只要插入ScrollViewer,TextBlock就不再包装了.

Viv*_*Viv 6

只是给TextBlock一个MaxWidth这是ActualWidth无论是中GroupBox或在您的情况下连layoutGrid(因为你GroupBox有相同的宽度).这将迫使TextBlock它必须在Width超过该尺寸时进行包装,从而满足您的要求.

所以类似于:

<GroupBox x:Name="grpBox"
          Grid.Row="2"
          Grid.ColumnSpan="3">
  <TextBlock MaxWidth="{Binding ElementName=grpBox,
                                Path=ActualWidth}"
              HorizontalAlignment="Left"
              VerticalAlignment="Top"
              Text="{Binding ...}"
              TextWrapping="Wrap" />
</GroupBox>
Run Code Online (Sandbox Code Playgroud)

要么

<TextBlock MaxWidth="{Binding ElementName=layoutGrid,
                              Path=ActualWidth}"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Text="{Binding ...}"
            TextWrapping="Wrap" />
Run Code Online (Sandbox Code Playgroud)