TextBlock
、Label
、MenuItem.Header
は大文字で表示されます。文字列はResourceDictionary
から取得されます。例:
<TextBlock Text="{StaticResource String1}"/>
<MenuItem Header="{StaticResource MenuItemDoThisAndThat}"/>
など(Label
およびその他のコントロール用)
バインディングがないため、値コンバーターを使用できません。辞書自体の文字列を大文字にしたくありません。
コンバータを使用することもできます。バインディングのソースにテキスト値を設定するだけです:
<TextBlock Text="{Binding Source={StaticResource String1}, Converter ={StaticResource myConverter}}"/>
コンバーターを使用する代わりに、TextBoxでCharacterCasingタグを使用できますが、場合によってはTextBlockでは機能しません。
<TextBox CharacterCasing="Upper" Text="{StaticResource String1}" />
これはあなたのために働くと思う
<TextBlock Text='{StaticResource String1}'Typography.Capitals="AllSmallCaps"/>
フォント大文字の列挙の場合 https://msdn.Microsoft.com/en-us/library/system.windows.fontcapitals(v = vs.110).aspx
このために添付プロパティとコンバーターを作成しました。おそらく既にコンバーターを持っているので、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);
}
}
これは質問に厳密に答えるわけではありませんが、同じ効果を引き起こすトリックを提供します。
ここで彼らの道を見つけた多くの人が、スタイルでこれを行う方法を探していると思います。 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を使用する必要があります。また、これを他のテンプレートの内部では使用せず、トピックスタイルとしてのみ使用します。