40

TextBlock、、のすべてのテキストを大文字で表示しLabelたい。MenuItem.Header文字列は、ResourceDictionary例 から取得されます。

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

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

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

4

8 に答える 8

40

私はこれがあなたのために働くと思います

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

フォントの大文字の列挙についてはhttps://msdn.microsoft.com/en-us/library/system.windows.fontcapitals(v=vs.110).aspx

于 2016-01-20T06:33:34.973 に答える
37

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

<TextBlock Text="{Binding Source={StaticResource String1},  Converter ={StaticResource myConverter}}"/>
于 2009-11-19T11:32:31.183 に答える
33

コンバーターを使用するのではなく、TextBox で CharacterCasing タグを使用できますが、この場合、TextBlock では機能しません。

<TextBox CharacterCasing="Upper" Text="{StaticResource String1}" />
于 2011-06-07T16:35:02.257 に答える
13

ピーターの回答を完了するには (私の編集は拒否されました)、次のようなコンバーターを使用できます。

C#:

public class CaseConverter : IValueConverter
{    
    public CharacterCasing Case { get; set; }

    public CaseConverter()
    {
        Case = CharacterCasing.Upper;
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var str = value as string;
        if (str != null)
        {
            switch (Case)
            {
                case CharacterCasing.Lower:
                    return str.ToLower();
                case CharacterCasing.Normal:
                    return str;
                case CharacterCasing.Upper:
                    return str.ToUpper();
                default:
                    return str;
            }
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML:

<TextBlock Text="{Binding Source={StaticResource String1}, Converter ={StaticResource myCaseConverter}}"/>
于 2015-04-24T07:35:18.007 に答える
7

このための添付プロパティとコンバーターを作成しました。おそらく既にコンバーターを持っているので、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);
        }
    }
于 2013-03-25T13:07:22.073 に答える
2

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

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

すべて大文字のテキストを使用する必要があるのは、ラベルの使用が正当化される見出しなどの場合です。私の解決策は次のとおりです。

<!-- 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 を使用する必要があります。また、これを他のテンプレート内で使用することはありませんが、厳密にトピック スタイルとしてのみ使用します。

于 2015-08-14T07:29:54.910 に答える
-3

次のプロパティを使用して、すべての入力を TextBox コントロールに大文字小文字を区別できます。

<TextBox CharacterCasing="Upper"

アプリケーション全体のすべての TextBox コントロールに適用するには、すべての TextBox コントロールのスタイルを作成します。

<Style TargetType="{x:Type TextBox}">
  <Setter Property="CharacterCasing" Value="Upper"/>
</Style>
于 2012-08-21T10:14:51.807 に答える