创建自定义文本块

时间:2015-04-17 13:54:34

标签: c# wpf

我希望有一个WPF控件可以自动转换大写的文本。我不想在WPF的文本块中添加任何其他功能。

所以我想我可以创建一个这样的类:

public class UpperTextBlock : TextBlock
    {
        static UpperTextBlock()
        {

        }
        public UpperTextBlock()
         {

         }
    }

我只想在" textchanged"上添加一个事件。并且一旦文本更改只是将其设置为大写,但我没有找到" textchanged"的等价物。我该怎么办?

谢谢!

首次回答后编辑

我想在我的所有模板中使用我的自定义控件,而不仅仅是针对特定的文本块,这就是为什么转换器或类似第一个答案的东西对我来说不够通用。

4 个答案:

答案 0 :(得分:2)

我能想到的最简单,最快捷的方法是从TextBlock得出并强制TextBlock.TextProperty值。为此,您需要覆盖属性元数据并指定强制回调。这是一个例子:

public class UpperTextBlock : TextBlock
{
    static UpperTextBlock()
    {
        TextBlock.TextProperty.OverrideMetadata(
            typeof(UpperTextBlock),
            new FrameworkPropertyMetadata(
                default(PropertyChangedCallback),
                (CoerceValueCallback)CoerceTextProperty));
    }

    private static object CoerceTextProperty(DependencyObject d, object baseValue)
    {
        if (baseValue is string)
            return ((string)baseValue).ToUpper();
        else
            return baseValue;
    }
}

答案 1 :(得分:0)

如果您遵循MVVM模式,则可以在视图模型中执行此操作

private string _textblock;
public string TextBlock
{
    get { return _textblock; }
    set { 
            _textblock = value.ToUpperInvariant(); 
            NotifyPropertyChanged("TextBlock"); 
        }
}

答案 2 :(得分:0)

您可以使用Value Converter可重复使用的" WPF-way"做事。

查看此link了解详情。

以下是示例代码:

public class ToLowerValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var str = value as string;
        return string.IsNullOrEmpty(str) ? string.Empty : str.ToUpper();
    }

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

答案 3 :(得分:0)

您可以创建另一个名为uppertext的依赖项属性,并且在依赖项属性已更改的属性上,您可以将Text of Text块设置为大写。请参阅下面的代码。

class UpperTextBlock : TextBlock
{
    public string UpperText
    {
        get { return (string)GetValue(UpperTextProperty); }
        set { SetValue(UpperTextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for UpperText.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty UpperTextProperty =
        DependencyProperty.Register("UpperText", typeof(string), typeof(UpperTextBlock), new PropertyMetadata(string.Empty, OnCurrentReadingChanged));

    private static void OnCurrentReadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UpperTextBlock txt = d as UpperTextBlock;
        txt.Text = txt.UpperText.ToUpper();
    }
}
 <local:UpperTextBlock UpperText="test"/>