【问题标题】:c# Override RichTextBox Paste Function - Win Form Appc# 重写 RichTextBox 粘贴函数 - Win Form App
【发布时间】:2012-09-13 21:53:44
【问题描述】:

我希望在我的 Windows 窗体应用程序上自定义富文本框控件。 RichTextbox 将用于输入文本数据,一旦完成,将通过 SMS 文本消息发送。

要求文本不能有任何换行符,因为某些旧手机无法正确显示信息并且会丢失格式。

我需要做的是在粘贴到 RTB 之前捕获剪贴板数据并自定义其格式,例如删除换行符。

我在这里找到了一个示例,该示例在一定程度上可以正常工作,但无法粘贴到其他控件中:-

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
               {

                        if((keyData == (Keys.Control | Keys.V)))
                        {
                        IDataObject iData = Clipboard.GetDataObject();

                        if (iData.GetDataPresent(DataFormats.Text))
                        {
                             string contents = Clipboard.GetText().Replace("\r\n", " ");
                             Clipboard.SetData(DataFormats.Text, contents);
                             richTextBox1.Paste();
                        }
                          return true;
                        } 
                        else 
                        {
                         return base.ProcessCmdKey(ref msg, keyData);
                        }
                }

请问有人知道我应该怎么做吗?

【问题讨论】:

  • 此外,此代码不会处理右键单击/粘贴操作。
  • 你不能在 Win Form 上这样做,只能在 WPF 中。

标签: c# winforms richtextbox


【解决方案1】:

你需要继承自RichTextBox,并添加你自己描述的自定义处理;您还可以将原始数据设置回剪贴板,以便能够将其粘贴到其他控件中(以原始形式):

public class CustomRTB:RichTextBox
    {
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {

            if ((keyData == (Keys.Control | Keys.V)))
            {
                IDataObject iData = Clipboard.GetDataObject();

                if (iData.GetDataPresent(DataFormats.Text))
                {
                    string contents = Clipboard.GetText();
                    // string newText = *process text here*
                    Clipboard.SetData(DataFormats.Text, newText);
                    this.Paste();
                    Clipboard.SetData(DataFormats.Text, contents);
                }
                return true;
            }
            else
            {
                return base.ProcessCmdKey(ref msg, keyData);
            }
        }

    }

【讨论】:

    【解决方案2】:

    尝试在文本更改时捕获文本并删除换行符:

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            RichTextBox box = (RichTextBox)sender;
            box.Text = box.Text.Replace(Environment.NewLine, string.Empty);
            box.Text = box.Text.Replace("\n", string.Empty);
            box.SelectionStart = box.TextLength;
            box.ScrollToCaret();
        }
    

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 2010-12-21
      相关资源
      最近更新 更多