グリッド内のWPFにいくつかのTextBlockがあり、使用可能な幅/高さに応じてスケーリングしたいと思います。フォントサイズを自動的にスケーリングすることを検索したときの典型的な提案は、TextBlockをViewBoxに入れることです。
だから私はこれをしました:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Viewbox MaxHeight="18" Grid.Column="0" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="{Binding Text1}" />
</Viewbox>
<Viewbox MaxHeight="18" Grid.Column="1" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="{Binding Text2}" />
</Viewbox>
<Viewbox MaxHeight="18" Grid.Column="2" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="{Binding Text3}" />
</Viewbox>
</Grid>
また、各TextBlockのフォントを自動的に拡大縮小します。ただし、TextBlockの1つに長いテキストがある場合、隣接するグリッド要素が大きいフォントになり、小さいフォントになるため、これはおかしいように見えます。フォントサイズをグループごとに拡大縮小したいのですが、一連のコントロールに「SharedSizeGroup」を指定して、フォントのサイズを自動調整できると便利です。
例えば
最初のテキストブロックテキストは「3/26/201310:45:30 AM」であり、2番目のテキストブロックテキストは「FileName.ext」である可能性があります。これらがウィンドウの幅全体にあり、ユーザーがウィンドウのサイズ変更を開始する場合。日付は、ファイル名の長さに応じて、フォントをファイル名よりも小さくし始めます。
理想的には、テキストフィールドの1つがフォントポイントサイズのサイズ変更を開始すると、それらはすべて一致します。誰かがこれに対する解決策を思いついたことがありますか、それともあなたがそれをどのように機能させるかについて私にショットを与えることができますか?カスタムコードが必要な場合は、将来のために再利用できるように、カスタムBlendまたはAttachedBehaviorに再パッケージ化できれば幸いです。かなり一般的な問題だと思いますが、検索しても何も見つかりませんでした。
更新 私はMathieuの提案を試しましたが、それは一種の動作ですが、いくつかの副作用があります。
<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="270" Width="522">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle Grid.Row="0" Fill="SkyBlue" />
<Viewbox Grid.Row="1" MaxHeight="30" Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="SomeLongText" Margin="5" />
<TextBlock Grid.Column="1" Text="TextA" Margin="5" />
<TextBlock Grid.Column="2" Text="TextB" Margin="5" />
</Grid>
</Viewbox>
</Grid>
</Window>
正直なところ、比例列が欠落していることはおそらく私にとっては問題ありません。スペースを賢く利用するために列の自動サイズ設定を行ってもかまいませんが、ウィンドウの幅全体にまたがる必要があります。
maxsizeがないことに注意してください。この拡張された例では、テキストが大きすぎます。
<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="270" Width="522">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle Grid.Row="0" Fill="SkyBlue" />
<Viewbox Grid.Row="1" Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="SomeLongText" Margin="5" />
<TextBlock Grid.Column="1" Text="TextA" Margin="5" />
<TextBlock Grid.Column="2" Text="TextB" Margin="5" />
</Grid>
</Viewbox>
</Grid>
ここでは、フォントの大きさを制限して、垂直ウィンドウの領域を無駄にしないようにします。出力が左、中央、右に配置され、フォントが希望の最大サイズまで可能な限り大きくなることを期待しています。
@adabyron
あなたが提案する解決策は悪くはありませんが(そしてこれまでで最高です)、いくつかの制限があります。たとえば、最初は列を比例させたいと思っていました(2番目の列は中央に配置する必要があります)。たとえば、私のTextBlocksは、配置が重要なグラフの開始、中央、および停止にラベルを付ける場合があります。
<Window x:Class="WpfApplication6.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:b="clr-namespace:WpfApplication6.Behavior"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle Grid.Row="0" Fill="SkyBlue" />
<Line X1="0.5" X2="0.5" Y1="0" Y2="1" Stretch="Fill" StrokeThickness="3" Stroke="Red" />
<Grid Grid.Row="1">
<i:Interaction.Behaviors>
<b:MoveToViewboxBehavior />
</i:Interaction.Behaviors>
<Viewbox Stretch="Uniform" />
<ContentPresenter >
<ContentPresenter.Content>
<Grid x:Name="TextBlockContainer">
<Grid.Resources>
<Style TargetType="TextBlock" >
<Setter Property="FontSize" Value="16" />
<Setter Property="Margin" Value="5" />
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="SomeLongText" VerticalAlignment="Center" HorizontalAlignment="Center" />
<TextBlock Grid.Column="2" Text="TextA" HorizontalAlignment="Center" VerticalAlignment="Center" />
<TextBlock Grid.Column="4" Text="TextB" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ContentPresenter.Content>
</ContentPresenter>
</Grid>
</Grid>
</Window>
そして、これが結果です。早い段階でクリップされていることを認識していないことに注意してください。ViewBoxを置き換えると、グリッドのデフォルトが列サイズ「自動」になり、中央に配置されなくなったように見えます。