2015-04-17 62 views
0

我想有一个WPF控件,可以自动将其文本转换为大写。我不想将任何其他函数添加到WPF的文本块。创建自定义文本块

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

public class UpperTextBlock : TextBlock 
    { 
     static UpperTextBlock() 
     { 

     } 
     public UpperTextBlock() 
     { 

     } 
    } 

我只是想在“框TextChanged”,一旦文本更改添加事件只是把它以大写,但我没有找到相当于“textchanged”。我怎么办?

谢谢!第一个答案后

编辑

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

+1

可能重复(http://stackoverflow.com/questions/1762485/wpf-xaml-how-to-make-all- text-upper-case-capital) –

+0

更好的重复http://stackoverflow.com/questions/24956046/wpf-xaml-how-to-make-all-text-upper-case-in-textblock –

回答

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; 
    } 
} 
+0

正是我在找的谢谢! – user2088807

0

如果你遵循MVVM模式,你可以做到这一点在你的视图模型

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

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

0

您可以使用Value Converter他们是可重复使用和做事的“WPF的方式。”

请检查此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; 
    } 
} 
0

您可以创建一个又一个依赖属性称为uppertext和改变依赖属性的属性就可以使文本块为大写的文本。请参阅以下代码。

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"/> 
[WPF/XAML?:如何使所有文字大写/资本]的