【问题标题】:modify Text in TextBox before Text is displayed [duplicate]在显示文本之前修改 TextBox 中的文本 [重复]
【发布时间】:2017-04-13 17:11:50
【问题描述】:

我想在显示之前修改在 TextBox 中键入的文本,而不查看已键入的文本。

示例: xaml:

<TextBox x:Name="tb" TextChanged="tb_TextChanged">
    my long text
</TextBox>

c#:

private void tb_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox tb = sender as TextBox;

    if (tb != null)
    {
        //save caretIndex
        int caretIndex = tb.CaretIndex;

        //modify Text //can be any modification
        //vvvvvvvvvvv Lines that I'm talking about

        tb.Text.ToLower(); //or: tb.Text.ToLower(); etc.

        char[] notAllowedChars = new char[] {'/t', '~', '#'}; //any other
        foreach (char c in notAllowedChars)
        {
            tb.Text = tb.Text.Replace(c, '_'); //replace unwanted characters
        }

        //^^^^^^^^^^^^ these lines modify the whole text

        //restore caretIndex
        tb.CaretIndex = caretIndex;
    }
}

在该示例中,将修改整个文本。但是所有其他字符都已修改。所以我不想再经历它们。我只想在插入之前修改更改的文本。

我说的是 100.000 多个字符。这意味着,查找所有字符会导致不必要的性能问题。

有没有什么解决办法或者是不可能的需求。

【问题讨论】:

  • 我会质疑将 100,000 个字符放入 TextBox开始 的智慧:)
  • 查看标记的重复项。只需使用Lower 而不是Upper
  • @BradleyDotNET :D 你完全正确。我想显示大文本文件,它们可以有超过 100.000 个字符:)
  • @PeterDuniho 很抱歉误导了你。 tb.Text.ToLower(); 只是文本修改的一个例子
  • 有多种解决方案,具体取决于您要究竟做什么。 Stack Overflow 已经充满了描述各种过滤和/或更改文本输入的方法的答案。您的问题“是否有任何解决方案”本质上太宽泛了。请做一些研究,尝试一下,如果您有一些具体困难,请发布一个问题,其中包含一个很好的minimal reproducible example,准确显示您尝试了什么,并详细说明您具体是什么无法解决。

标签: c# wpf textbox textchanged


【解决方案1】:

你可以看TextChangedEventArgs看看有什么变化,然后再修改一下文字……下面是一些起始代码:

private bool m_bInTextChanged;
private void tb_TextChanged(object sender, TextChangedEventArgs e)
{
    if (m_bInTextChanged)
        return;

    m_bInTextChanged = true;

    TextBox tb = sender as TextBox;

    if (tb != null)
    {
        //save caretIndex
        int caretIndex = tb.CaretIndex;

        if (e.Changes.Any())
        {
            var addedchanges = e.Changes.Where(tc => tc.AddedLength > 0);

            foreach (var added in addedchanges)
            {
                string stringchanged = tb.Text.Substring(added.Offset, added.AddedLength);

                tb.Select(added.Offset, added.AddedLength);

                tb.SelectedText = stringchanged.ToLower();
            }
        }

        //restore caretIndex
        tb.CaretIndex = caretIndex;
    }

    m_bInTextChanged = false;
}

【讨论】:

  • 非常感谢 :) 工作正常。实际上我查看了... e.Changes.Where(tc =&gt; tc.AddedLength &gt; 0); 但无法通过它:) 再次感谢。
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2011-10-16
  • 2021-05-28
相关资源
最近更新 更多