web-dev-qa-db-ja.com

すべてのテキストを大文字/大文字にする方法は?

TextBlockLabelMenuItem.Headerは大文字で表示されます。文字列はResourceDictionaryから取得されます。例:

<TextBlock Text="{StaticResource String1}"/>
<MenuItem Header="{StaticResource MenuItemDoThisAndThat}"/>

など(Labelおよびその他のコントロール用)

バインディングがないため、値コンバーターを使用できません。辞書自体の文字列を大文字にしたくありません。

33
GG.

コンバータを使用することもできます。バインディングのソースにテキスト値を設定するだけです:

<TextBlock Text="{Binding Source={StaticResource String1},  Converter ={StaticResource myConverter}}"/>
33
Peter

コンバーターを使用する代わりに、TextBoxでCharacterCasingタグを使用できますが、場合によってはTextBlockでは機能しません。

<TextBox CharacterCasing="Upper" Text="{StaticResource String1}" />
31
scrat789

これはあなたのために働くと思う

<TextBlock Text='{StaticResource String1}'Typography.Capitals="AllSmallCaps"/>

フォント大文字の列挙の場合 https://msdn.Microsoft.com/en-us/library/system.windows.fontcapitals(v = vs.110).aspx

23
Alias Varghese

このために添付プロパティとコンバーターを作成しました。おそらく既にコンバーターを持っているので、CaseConverterへの参照を、使用している実装に置き換えてください。

添付プロパティは、大文字にしたい場合に設定する単なるブール値です(明らかに、これを拡張して、選択したスタイルの列挙型にすることもできます)。プロパティが変更されると、必要に応じてTextBlockのTextプロパティが再バインドされ、コンバーターが追加されます。

プロパティが既にバインドされている場合は、もう少し作業が必要になる場合があります-私のソリューションでは、それが単純なパスバインドであると想定しています。しかし、ソースなども複製する必要があるかもしれません。しかし、私はこの例を十分に理解するのに十分だと感じました。

添付プロパティは次のとおりです。

public static bool GetUppercase(DependencyObject obj)
    {
        return (bool)obj.GetValue(UppercaseProperty);
    }

    public static void SetUppercase(DependencyObject obj, bool value)
    {
        obj.SetValue(UppercaseProperty, value);
    }

    // Using a DependencyProperty as the backing store for Uppercase.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty UppercaseProperty =
        DependencyProperty.RegisterAttached("Uppercase", typeof(bool), typeof(TextHelper), new PropertyMetadata(false, OnUppercaseChanged));

    private static void OnUppercaseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBlock txt = d as TextBlock;

        if (txt == null) return;

        var val = (bool)e.NewValue;

        if (val)
        {
            // rebind the text using converter
            // if already bound, use it as source

            var original = txt.GetBindingExpression(TextBlock.TextProperty);

            var b = new Binding();

            if (original != null)
            {
                b.Path = original.ParentBinding.Path;
            }
            else
            {
                b.Source = txt.Text;
            }

            b.Converter = new CaseConverter() { Case = CharacterCasing.Upper };


            txt.SetBinding(TextBlock.TextProperty, b);
        }
    }
8
Lauren

これは質問に厳密に答えるわけではありませんが、同じ効果を引き起こすトリックを提供します。

ここで彼らの道を見つけた多くの人が、スタイルでこれを行う方法を探していると思います。 TextBlockは、ここではControlではなくFrameworkElementであり、そのためこのテンプレートを定義してトリックを実行できないため、少し注意が必要です。

すべて大文字のテキストを使用する必要があるのは、見出しまたはLabelの使用が正当化されるようなものの場合です。私の解決策は:

<!-- Examples of CaseConverter can be found in other answers -->

<ControlTemplate x:Key="UppercaseLabelTemplate" TargetType="{x:Type Label}">
    <TextBlock Text="{TemplateBinding Content, Converter={StaticResource CaseConverter}}" />
</ControlTemplate>

<Style x:Key="UppercaseHeadingStyle"
       TargetType="{x:Type Label}">
    <Setter Property="FontSize" Value="20" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Template" Value="{StaticResource UppercaseLabelTemplate}" />
</Style>

<!-- Usage: -->
<Label Content="Header" Style="{StaticResource UppercaseHeadingStyle}" />

これにより、Labelのデフォルトの動作の一部が無効になり、テキストに対してのみ機能することに注意してください。したがって、これをデフォルトとして定義しません(とにかくすべてのラベルを大文字にする必要はありません)。もちろん、このスタイルが必要な場合は、TextBlockの代わりにLabelを使用する必要があります。また、これを他のテンプレートの内部では使用せず、トピックスタイルとしてのみ使用します。

2
Ahe