如何使所有文本大写/大写?

时间:2009-11-19 10:54:01

标签: wpf xaml formatting textblock

我希望TextBlockLabelMenuItem.Header中的所有文字都以大写字母显示。 字符串取自ResourceDictionary例如:

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

等。 (也适用于Label和其他控件)

我无法使用值转换器,因为没有绑定。我不想在字典本身中使字符串大写。

8 个答案:

答案 0 :(得分:32)

您仍然可以使用转换器,只需在绑定源中设置文本值:

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

答案 1 :(得分:31)

您可以在TextBox中使用标记CharacterCasing,而不是使用转换器,但在您的情况下,它不适用于TextBlock。

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

答案 2 :(得分:24)

我认为这对你有用

/* Define ALIASNAME as a weak alias for NAME.
   If weak aliases are not available, this defines a strong alias.  */
# define weak_alias(name, aliasname) _weak_alias (name, aliasname)
# define _weak_alias(name, aliasname) \
  extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));

对于字体大写枚举https://msdn.microsoft.com/en-us/library/system.windows.fontcapitals(v=vs.110).aspx

答案 3 :(得分:12)

要完成Peter的回答(我的编辑已被拒绝),您可以使用这样的转换器:

<强> 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}}"/>

答案 4 :(得分:8)

我为此创建了附加属性和转换器。您可能已经拥有转换器,因此将我对CaseConverter的引用替换为您拥有的任何实现。

如果你希望它是大写的,那么附加属性只是你设置的一个布尔值(显然你可以将它扩展为可选择的样式的枚举)。当属性更改时,它会根据需要重新绑定TextBlock的Text属性,并添加转换器。

当属性已经绑定时,可能需要做更多的工作 - 我的解决方案假设它是一个简单的Path绑定。但它可能还需要复制源等。但我觉得这个例子足以说明我的观点。

这是附属物:

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);
        }
    }

答案 5 :(得分:2)

这并没有严格回答这个问题,但确实提供了一个引起同样效果的技巧。

我相信许多人在这里找到自己的方式正在寻找如何用风格做到这一点。 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的某些默认行为,并且仅适用于文本,因此我不会将其定义为默认值(无论如何,没有人可能希望所有标签都是大写的)。当然,当您需要这种风格时,您必须使用Label而不是TextBlock。此外,我不会在其他模板中使用它,但仅限于主题样式。

答案 6 :(得分:0)

    public class StaticResourceToUpperExtension : StaticResourceExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var resource = base.ProvideValue(serviceProvider);
            if (resource is string str)
                return str.ToUpper();
            return resource;
        }

        public StaticResourceToUpperExtension() : base() { }
        public StaticResourceToUpperExtension(object resourceKey) : base(resourceKey) { }

    }
    <Grid>
        <FrameworkElement.Resources>
            <sys:String x:Key="String1">any text</sys:String>
        </FrameworkElement.Resources>
        <TextBlock Text="{local:StaticResourceToUpper String1}"/>
    </Grid>

答案 7 :(得分:-2)

您可以使用以下属性将所有输入置于TextBox控件中:

<TextBox CharacterCasing="Upper"

要应用于整个应用程序中的所有TextBox控件,请为所有TextBox控件创建样式:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="CharacterCasing" Value="Upper"/>
</Style>