在 WPF TextBox 中显示特殊字符
Display special characters in WPF TextBox
我有一个像 [VIP]
这样的字符串,但文本框只显示为 [VIP]
。我怎样才能像在浏览器中那样至少将这些特殊字符显示为正方形?试图设置多个字体系列(<Setter Property="FontFamily" Value="Arial, Symbol"/>
),但它不起作用。
我不想使用 richtextbox,因为它会大大增加 window 渲染时间。
更新:好吧,Whosebug 文本渲染器也吃这个字符,所以字符串是
"\u0001[\u0004VIP\u0001] "
希望我理解你的问题。
将下面的附件 属性 添加到您的项目中。它可以将“[”字符转换为“\u0001”。
class CharacterConvertBehavior : DependencyObject
{
public static bool GetConvertEnable(DependencyObject obj)
{
return (bool)obj.GetValue(ConvertEnableProperty);
}
public static void SetConvertEnable(DependencyObject obj, bool value)
{
obj.SetValue(ConvertEnableProperty, value);
}
// Using a DependencyProperty as the backing store for ConvertEnable. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ConvertEnableProperty =
DependencyProperty.RegisterAttached("ConvertEnable", typeof(bool), typeof(CharacterConvertBehavior), new PropertyMetadata(ConvertEnableChanged));
private static void ConvertEnableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBox = d as TextBox;
if ((bool)e.NewValue == true)
textBox.PreviewKeyDown += TextBox_ConvertHandler;
else
textBox.PreviewKeyDown -= TextBox_ConvertHandler;
}
#region Convert Handler
private static void TextBox_ConvertHandler(object sender, KeyEventArgs e)
{
var textBox = sender as TextBox;
if (e.Key == Key.Oem4) // "["
{
string convertString = "\u0001";
TextCompositionManager.StartComposition(new TextComposition(InputManager.Current, textBox, convertString));
e.Handled = true;
}
}
#endregion
}
通过这种方式,您可以添加所需的功能。
以上代码可以在主工程中使用,如下所示。
<Window x:Class="WhosebugAnswers.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:attached="clr-namespace:Parse.WpfControls.AttachedProperties"
xmlns:local="clr-namespace:WhosebugAnswers"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<Style x:Key="ConvertableTextBox" TargetType="TextBox">
<Setter Property="attached:CharacterConvertBehavior.ConvertEnable" Value="True"/>
</Style>
</Window.Resources>
<Grid>
<TextBox Style="{StaticResource ConvertableTextBox}"/>
</Grid>
</Window>
我有一个像 [VIP]
这样的字符串,但文本框只显示为 [VIP]
。我怎样才能像在浏览器中那样至少将这些特殊字符显示为正方形?试图设置多个字体系列(<Setter Property="FontFamily" Value="Arial, Symbol"/>
),但它不起作用。
我不想使用 richtextbox,因为它会大大增加 window 渲染时间。
更新:好吧,Whosebug 文本渲染器也吃这个字符,所以字符串是
"\u0001[\u0004VIP\u0001] "
希望我理解你的问题。
将下面的附件 属性 添加到您的项目中。它可以将“[”字符转换为“\u0001”。
class CharacterConvertBehavior : DependencyObject
{
public static bool GetConvertEnable(DependencyObject obj)
{
return (bool)obj.GetValue(ConvertEnableProperty);
}
public static void SetConvertEnable(DependencyObject obj, bool value)
{
obj.SetValue(ConvertEnableProperty, value);
}
// Using a DependencyProperty as the backing store for ConvertEnable. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ConvertEnableProperty =
DependencyProperty.RegisterAttached("ConvertEnable", typeof(bool), typeof(CharacterConvertBehavior), new PropertyMetadata(ConvertEnableChanged));
private static void ConvertEnableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBox = d as TextBox;
if ((bool)e.NewValue == true)
textBox.PreviewKeyDown += TextBox_ConvertHandler;
else
textBox.PreviewKeyDown -= TextBox_ConvertHandler;
}
#region Convert Handler
private static void TextBox_ConvertHandler(object sender, KeyEventArgs e)
{
var textBox = sender as TextBox;
if (e.Key == Key.Oem4) // "["
{
string convertString = "\u0001";
TextCompositionManager.StartComposition(new TextComposition(InputManager.Current, textBox, convertString));
e.Handled = true;
}
}
#endregion
}
通过这种方式,您可以添加所需的功能。
以上代码可以在主工程中使用,如下所示。
<Window x:Class="WhosebugAnswers.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:attached="clr-namespace:Parse.WpfControls.AttachedProperties"
xmlns:local="clr-namespace:WhosebugAnswers"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<Style x:Key="ConvertableTextBox" TargetType="TextBox">
<Setter Property="attached:CharacterConvertBehavior.ConvertEnable" Value="True"/>
</Style>
</Window.Resources>
<Grid>
<TextBox Style="{StaticResource ConvertableTextBox}"/>
</Grid>
</Window>