如何将System.Windows.Control.TextBox
中输入的所有空格字符显示为其他字符,例如点? ····
e.g:
输入您的文字:[abc······def]
理想情况下,我还希望以比文本其余部分更浅的颜色显示点
当用户输入空格时,文本框应仅显示其他内容。理想情况下,我不想修改实际的字符串。因此TextBox.Text
的内部值应该保持不变,当用户将内容复制到剪贴板,或者以与文本框类似的方式进行交互时,它们应该得到空格而不是点。
我在相关Stackoverflow question中找到的解决方案,覆盖OnTextChangedEvent或使用IValueConverter,可以替换输入的空格,但这当然也会修改支持字符串,我希望这样做对应用程序和用户完全透明。
答案 0 :(得分:1)
最简单的方法是使用String.Replace
方法操纵值。您可以在TextBox.TextChanged
event处理程序中执行此操作:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;
// take note of current Caret position within TextBox
int caretIndex = textBox.CaretIndex;
textBox.Text = textBox.Text.Replace(" ", "•");
// reset Caret to original position
textBox.CaretIndex = caretIndex;
}
这里的技巧是使用用户无法输入的字符:"•"
(只需复制并粘贴此字符)。使用这个不可用的字符,之后很容易恢复空格:
string originalValue = textBox.Text.Replace("•", " ");
不幸的是,如果不使用RichTextBox
或者付出很多努力,你将无法将这个点着色为不同的颜色。
答案 1 :(得分:1)
您可以使用值转换器执行此操作 - 这对我有用:
public sealed class WhiteSpaceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string str = (string)value;
if (str == null) return value;
return str.Replace(" ", "·");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string str = (string)value;
if (str == null) return value;
return str.Replace("·", " ");
}
}
我还在ApplicationCommands.Copy
的文本框的命令绑定中添加了以下内容(因此,如果用户选择并复制空格,则会获得实际空格而不是替换它的点字符):< / p>
static Converters.WhiteSpaceConverter conv = new Converters.WhiteSpaceConverter();
private void TextBox_Copy_Executed(object sender, ExecutedRoutedEventArgs e)
{
TextBox tb = sender as TextBox;
if (tb != null)
Clipboard.SetText((string)conv.ConvertBack(tb.SelectedText, typeof(TextBox), null, System.Globalization.CultureInfo.CurrentCulture));
}
给我这样的XAML:
<cnv:WhiteSpaceConverter x:Key="WhiteSpaceConverter" />
...
<TextBox FontFamily="Consolas"
Text="{Binding ViewModelStringProperty,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource WhiteSpaceConverter}}"
>
<TextBox.CommandBindings>
<CommandBinding Command="{x:Static ApplicationCommands.Copy}" Executed="TextBox_Copy_Executed" />
</TextBox.CommandBindings>
</TextBox>
警告:如果用户在文本框中输入一个点符号,这将最终将点字符转换为空格,如果转换器运行,也会导致从支持字符串中丢失该字符。