Style トリガーで Text の FontSize を変更すると、テキストを含む Control のサイズも変更されます。親のサイズに影響を与えずに Fontsize を変更するにはどうすればよいですか?
6 に答える
FontSizeを小さくすると同時にパディングを増やすことができます。これにより、計算されたボタンの高さが同じままになります。
<StackPanel>
<Button Content="ABC">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="20"/>
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Padding" Value="5"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<Button Margin="0,20" Content="123" FontSize="20"/>
<Button Content="Do Re Mi" FontSize="20"/>
</StackPanel>
FontSizeが増加している場合は、逆の操作を行って負のパディングを設定することもできます。
FontSizeからPaddingへのバインディングを使用して、一般的な方法で同じことを実行することもできますが、固定されたFontSizeのセットのみを処理する場合は、上記のようにハードコーディングする方が簡単です。
ハードコーディングされた幅、クレイジーなメジャーのオーバーライド、トリッキーなバインド、またはそのようなものはまったく必要ありません。
解決策は実際には信じられないほど簡単です。スタイル トリガーでフォント サイズを変更する代わりに、RenderTransform をコンテンツ プレゼンター要素に適用して、ボタンの単純なコントロール テンプレートを作成します。ScaleTransform を RenderTransform に追加します。IsPressed トリガー定義内で、ScaleTransform の垂直方向と水平方向のスケールを小さい比率 (0.8 など) に設定します。
RenderTransform を使用すると、押されたボタンのレイアウトが同じに保たれるため、他の要素の位置には影響しません。対照的に、LayoutTransform を使用すると、実際にはボタン コンテナーが縮小され、親コンテナーの ArrangeOverride メソッドにより、隣接するボタンが余分なスペースを埋めるために移動されます。
私は今とても忙しいので、実際の実装はあなたにお任せします!;-)
http://msdn.microsoft.com/en-us/library/system.windows.media.scaletransform.aspx
IsKeyboardFocused、IsPressed、IsDefaulted などのトリガーを持つラベル (フラット テキスト、境界線なし) のように見えるように、ButtonControl の ControlTemplate を作成しています。
IsPressed は、FontSize を (デフォルトの 30 から) 28 に下げるように定義されています。押されたアニメーション効果を与えるため。
これらのボタンの 1 つの用途は、垂直セパレーターで区切られたボタンの水平 StackPanel です。IsPressed トリガーがボタンで起動され、サイズが変更されると、ボタンの行全体が再調整されますが、これは好ましい視覚効果ではありません。
私の好みは、オーバーライドを提供するために新しいコントロールを導入することを避けるため、テンプレート ベースのソリューションです。ハードコーディングされたサイズアプローチの唯一の問題は国際化であり、他の言語では元のサイズが大きくなります。
私が行っている解決策は、ボタンの DesiredSize が計算された後に C# で minWidth を設定することです。Button がレンダリングされた後でも Width は NaN であるため、DesiredSize の使用/存在に注意してください。後で、C# を XAMLize してみます。
あなたが試すことができるいくつかのことを考えることができます:
コントロールの Measure Pass をオーバーライドできます。コントロールが WPF でレンダリングされると、2 つのパスが実行されます。1 つ目は「メジャー パス」です。ここで、コントロールはどのようなサイズになりたいかを考え出します。2 つ目は「アレンジ パス」で、実際にコントロールを配置します。WPF には、 MeasureOverrideというメソッドが用意されています。このメソッドをオーバーライドすると、コントロールのサイズを調整するために使用できるカスタム動作を提供できます。
注- コントロールを適切にレイアウトするには、このオーバーライド中にすべてのコントロールの子に対して Measure メソッドを呼び出す必要があると思います。
コントロールの高さと幅をハード コードします。これにより、コントロールの DesiredSize が値でオーバーライドされます。一般的には最高のアイデアではありませんが、うまくいきます。
どのようなコントロールを使用していますか? これが GroupBox や TabItem のような HeaderedControl の場合、次のように HeaderTemplate を具体的に設定する必要があります。
<DataTemplate x:Key="MyHeaderTemplate">
<TextBlock Text="{Binding}" Fontsize="14" FontWeight="Bold" />
</DataTemplate>