我希望有一个WPF控件可以自动转换大写的文本。我不想在WPF的文本块中添加任何其他功能。
所以我想我可以创建一个这样的类:
public class UpperTextBlock : TextBlock
{
static UpperTextBlock()
{
}
public UpperTextBlock()
{
}
}
我只想在" textchanged"上添加一个事件。并且一旦文本更改只是将其设置为大写,但我没有找到" textchanged"的等价物。我该怎么办?
谢谢!
首次回答后编辑
我想在我的所有模板中使用我的自定义控件,而不仅仅是针对特定的文本块,这就是为什么转换器或类似第一个答案的东西对我来说不够通用。
答案 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"/>