将文本框中的空格显示为不同的字符

时间:2014-06-13 09:54:28

标签: c# wpf user-interface formatting whitespace

如何将System.Windows.Control.TextBox中输入的所有空格字符显示为其他字符,例如点? ····

e.g:

  

输入您的文字:[abc······def]

理想情况下,我还希望以比文本其余部分更浅的颜色显示点

当用户输入空格时,文本框应仅显示其他内容。理想情况下,我不想修改实际的字符串。因此TextBox.Text的内部值应该保持不变,当用户将内容复制到剪贴板,或者以与文本框类似的方式进行交互时,它们应该得到空格而不是点。

我在相关Stackoverflow question中找到的解决方案,覆盖OnTextChangedEvent或使用IValueConverter,可以替换输入的空格,但这当然也会修改支持字符串,我希望这样做对应用程序和用户完全透明。

2 个答案:

答案 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>

警告:如果用户在文本框中输入一个点符号,这将最终将点字符转换为空格,如果转换器运行,也会导致从支持字符串中丢失该字符。