2015-04-17 97 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?:如何使所有文字大寫/資本]的