【问题标题】:RichTextBox replacing input with "random" unicode characterRichTextBox 用“随机”Unicode 字符替换输入
【发布时间】:2014-09-06 15:26:15
【问题描述】:

我有一个允许用户浏览数据的应用程序。我有控制导航的菜单项和显示数据的 RichTextBox。非常简单。

tl;dr 版本

除了一个奇怪的问题外,它大部分都有效。在某些情况下,RichTextControl 会将键入的第一个字符替换为随机 unicode 字符。随意下载此示例应用并亲自查看:

http://www.technitivity.com/stackoverflow/RichTextFocusTest.zip

完整说明

在行之间导航时会出现此问题。最好用几个用例来描述:

用例 1

  1. 导航到数据集中的任意位置。
  2. 按回。
  3. 按下一步。
  4. 输入任意字母,例如“F”。
  5. 结果:“F”按预期出现在 RichTextBox 中。

用例 2

  1. 导航到数据集中的任意位置。
  2. 两次
  3. 按两次下一步。
  4. 输入字母“F”。
  5. 结果:RichTextBox 中出现的不是“F”,而是“ᅲ”。

用例 3

  1. 导航到数据集中的任意位置。
  2. 下一步两次。
  3. 按两次。
  4. 输入字母“F”。
  5. 结果:RichTextBox 中出现的不是“F”,而是“᧴”。

导航过程只需要:

// either forward
i++;
// or backward
i--;
// then update
RichTextBox1.Text = MyData[i];

从程序上讲:

// This works
RichTextBox1.Text = MyData[3];

// This works
RichTextBox1.Text = MyData[3];
RichTextBox1.Text = MyData[2];
RichTextBox1.Text = MyData[3];

// This doesn't work
RichTextBox1.Text = MyData[3];
RichTextBox1.Text = MyData[2];
RichTextBox1.Text = MyData[1];
RichTextBox1.Text = MyData[2];
RichTextBox1.Text = MyData[3];

当然,这不是实际正在发生的事情,而是有效正在发生的事情。

请务必注意,如果 RichTextBox 在更新之间失去焦点,则不会发生这种情况。只有当 RichTextBox 保持焦点,同时它的 Text 属性按照上述描述更新时才会发生这种情况。

我完全不知道是什么导致了这个问题,如何解决它,或者为什么我似乎找不到其他人遇到这个问题。

我已经在 64 位 Windows 7 和 32 位 Windows Vista 上复制了它。这是在 .NET Framework 4 上的,尽管我也能够在 .NET Framework 2 项目上重现。

希望其他人遇到过这个问题(并解决了它!)

编辑:

截图如下:

http://www.technitivity.com/stackoverflow/RichTextBox-Screenshot1.png

如 cmets 中所述,要在示例应用程序中重现这一点,您必须使用键盘菜单快捷方式。如果单击菜单项(或工具栏按钮),RichTextBox 会失去焦点,问题就会消失。但是,如果您使用 Alt+Left 或 Alt+Right(后退/下一个)并键入 then 浏览项目,您应该会看到类似于上面屏幕截图中显示的内容。

【问题讨论】:

  • 我刚刚下载了你的演示源代码,在VS 2008/Framework 3.5/Windows 7/Debug/AnyCPU中构建,我无法重现问题。 (出于安全原因,我没有运行您提供的 .exe。)您能否描述我需要对演示应用执行的用户操作的确切顺序?例如,“导航到数据集中的任何地方”是否意味着“用鼠标在两个字母之间单击”?
  • 您需要确保使用菜单项快捷键进行导航。如果您单击菜单项或单击工具栏按钮,则不会发生此问题(因为您将焦点从 RichTextBox 移开)。快捷键是 Alt+Left 和 Alt+Right。

标签: c# .net richtextbox


【解决方案1】:

我不愿将其称为“答案”,但我找不到“发布黑客”按钮,而这个黑客确实让我暂时通过了。我对此并不感到兴奋,但有时你只需要继续前进。在这里。

由于RichTextBox失去焦点后问题消失了,我尝试了一个实验:

  • 我创建了一个可见的 0 像素宽的文本框,称为 Hacktastic。
  • 我向 RichTextBox 添加了一个 KeyPress 事件。
  • 在按键上:
    • Hacktastic.Focus();
    • Hacktastic.Text = KeyChar.ToString();
    • MyRichTextBox.Focus();

这行得通,并且(至少现在)我坚持将其作为解决方案。如果有人仍然可以尝试我的示例项目并重现和/或解决此问题,我希望得到进一步的反馈:

http://www.technitivity.com/stackoverflow/RichTextFocusTest.zip

在测试项目中repro的步骤:

  1. 使用 Alt+右箭头,在数据集中移动到第四条记录。
  2. 使用 Alt+向左箭头,将数据集向后移动两个位置,到达第二条记录。
  3. 使用 Alt+右箭头,移回第四条记录。
  4. 按任意键字符。
  5. 观察 KeyChar 被替换为“随机”的大值 unicode 字符。

我说“随机”是因为一组特定的导航(后退/下一个)击键将插入完全相同的 unicode 字符。但是,根据您在系列中的起始位置或后退的距离,您将获得不同的角色。

另外,请注意,仅返回一条记录并转发一条记录不会导致问题。您必须至少移动两条记录才能发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2017-05-20
    • 2017-03-08
    • 2018-05-21
    • 2018-04-19
    • 2011-04-26
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多