web-dev-qa-db-ja.com

幅の自動列内でTextBlockをTextWrapする方法は?

次のように考えてください。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>

このXAMLはWrapTextBlockテキストを折り返すことを許可します。これを行うと、WrapTextBlockはすべてのスペースを取り、NotWrapTextBlockを右にプッシュします。

しかし、私がやりたいのは、WrapTextBlockに可能な限り少ないスペースを割り当て、NotWrapTextBlockの直後にWrapTextBlockを押して右側を空のスペースで埋めることです。

つまり、次のことを意味します。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>

しかし、ここで重要なのは、WrapTextBlockのテキストが折り返されなくなったことです。

私は次のようなものを意味します:

テキストが長すぎる場合、ワープする必要があります。

テキストがワープする必要がないほど短い場合:

18
King Chan

その理由は、ColumnDefinitionをAutoまたは*として定義することにより、TextBlockが使用できるサイズを制限するものは何もありません。したがって、テキストが折り返されないことが予想される動作です。したがって、WidthまたはMaxWidthのいずれかに直接ColumnDefinitionまたはTextBlockを定義する必要があります。たとえば、

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MaxWidth="50"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBlock x:Name="WrapTextBlock" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
        <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
    </Grid>

代わりに、たとえば、グリッドが使用する必要があるスペースの7%だけを使用できるようにしたい場合は、Widthを次のように変更します。

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="0.07*"/>
  <ColumnDefinition Width="0.93*"/>
</Grid.ColumnDefinitions>

したがって、最初の列は使用可能なスペースの7%を占め、右側の列は残りを消費します。お役に立てれば。

追加を編集:

表示しているものは、最初のスニペットとほぼ一致しています。最初のスニペットでは最初の列がプッシュされ、2番目のスニペットではコンテンツを表示するのに十分なスペースのみが許可されます。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>
20
Chris W.