6

簡単にするために、「タイトル」TextBlock を持つ垂直スタック パネルとそれに続く ContentPresenter を持つカスタム WPF コントロールを作成しています。「タイトル」のフォント サイズを、ユーザーがこのコントロールを配置するコンテナーに継承されるコンテンツで使用されるサイズよりも 5 ポイント大きくしたいと考えています。

「TitleFontSize」のようなプロパティをユーザーに公開せずに、相対値を使用してヘッダー要素のコントロール テンプレートでフォント サイズを指定するにはどうすればよいですか? 「5を足す」をしたい。

ヘッダー テキスト ブロックで ScaleTransform を使用してみましたが、結果はまちまちでした (テキスト ブロックは適切にスケーリングされましたが、向きが変更されました。テキストを右揃えにして、スケーリング時に「コントロール」領域から移動しました)。また、ここでスケール変換が適切かどうかもわかりません。

4

2 に答える 2

14

より一般的な方法

値コンバーター

public class MathConverter : IValueConverter
{
    public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        return (double)value + double.Parse( parameter.ToString() );
    }

    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        return null;
    }
}

コンバータ リソース

<my:MathConverter x:Key="MathConverter" />

XAML

<TextBlock FontSize="{Binding
                     RelativeSource={RelativeSource AncestorType={x:Type Window}},
                     Path=FontSize,
                     Converter={StaticResource MathConverter},
                     ConverterParameter=2}" />
于 2010-02-03T03:18:35.920 に答える
5

次のようにIValueConverterでそれを行いました:

IValueConverter から派生するクラス FontSizeConverter を作成しました。Convert メソッドは値に 10 を加算し、ConvertBack メソッドは 10 を減算します。

public class FontSizeConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (double)value + 12.0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (double)value - 12.0;
    }

    #endregion
}

次に、コントロールの XAML テンプレートでこのクラスのインスタンスを宣言しました。

<Style.Resources>
        <local:FontSizeConverter x:Key="fontSizeConverter"/>
</Style.Resources>

最後に、FontSize バインディングは、継承された FontSize プロパティに適用されるこのコンバーターを使用します。

<TextBlock FontSize="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontSize, Converter={StaticResource fontSizeConverter}}" 
                                   Grid.Row="0" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                   Path=Date.Day}" HorizontalAlignment="Right" VerticalAlignment="Top" Padding="2" Margin="2" >
 </TextBlock>

これは機能します。しかし、これが正しい答えかどうかはまだわかりません。もっと良い方法があるか、またはこれが適切かどうか教えてください。

于 2008-11-22T20:56:17.087 に答える