C# 防止富文本框中的图像

C# 防止富文本框中的图像,c#,winforms,richtextbox,C#,Winforms,Richtextbox,我正在开发一个C#winForms应用程序,其中我使用了很多RichTextBox。我发现,如果我复制了一幅图像并将其粘贴到任何RichTextBox中,该图像就会被发布。是否有一种方法不允许在RichTextBox中粘贴图像。换句话说,只允许键盘字符。也许,您可以捕获粘贴事件并检查复制到RichTextBox的对象。 如果它是图像,就删除它。我能够回答我的问题。在这里,以防有人在找它 private void InputExpressionRchTxt_KeyDown(object sende

我正在开发一个C#winForms应用程序,其中我使用了很多RichTextBox。我发现,如果我复制了一幅图像并将其粘贴到任何RichTextBox中,该图像就会被发布。是否有一种方法不允许在RichTextBox中粘贴图像。换句话说,只允许键盘字符。

也许,您可以捕获粘贴事件并检查复制到RichTextBox的对象。
如果它是图像,就删除它。

我能够回答我的问题。在这里,以防有人在找它

private void InputExpressionRchTxt_KeyDown(object sender, KeyEventArgs e)
{
    bool ctrlV = e.Modifiers == Keys.Control && e.KeyCode == Keys.V;
    bool shiftIns = e.Modifiers == Keys.Shift && e.KeyCode == Keys.Insert;
    if (ctrlV || shiftIns)
        if (Clipboard.ContainsImage())
            e.Handled = true;
}

上述答案的问题在于,它在内容混合的情况下不起作用。例如,如果突出显示电子表格中的几行并粘贴到richtextbox中,则最终将得到的不仅仅是原始文本。我认为更好的解决方案如下:

    private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.V)
        {
            if (Clipboard.GetData("Text") != null)
                Clipboard.SetText((string)Clipboard.GetData("Text"), TextDataFormat.Text);
            else
                e.Handled = true;
        }            
    }
编辑:下面的方法是MrCC共享的,比我上面的方法更直接/更好

    private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.V)
        {
            if (Clipboard.ContainsText())
                richTextBox1.Paste(DataFormats.GetFormat(DataFormats.Text));
            e.Handled = true;
        }
    }

我认为最好的办法是识别RichTextBox的内容已更改,然后对RTF内容执行一些操作,以删除可能已粘贴的任何图像。我怎么知道有图像?RTF格式定义了“标记”-您需要使用某种方法(可能是正则表达式)解析RTF并删除与图像相关的标签。如何检查它是否是图像?!调试,看看会出现什么:)只需执行以下操作:if(copiedObject.GetType()是Image)if为true-销毁它或者调用textbox的clear函数尝试以下操作:void richTextBox1_TextChanged(object sender,EventArgs e){RichTextBox txt=sender as RichTextBox;if(txt.UndoActionName==“粘贴”&&txt.Text==“”){txt.Clear();}}}但是,有一件事:如果ReachTextBox中已经有一些文本,那么它就不起作用了。例如,从Onenote复制文本会用文本和表示该文本的位图图像填充剪贴板。由于某些原因,CTRL-V始终插入位图表示,因此有必要拦截CTRL-V。上面的代码有点迂回——如果有纯文本格式,它会用纯文本格式覆盖剪贴板,并让内部处理程序实际执行粘贴(因此if分支中没有
e.Handled=true;
)。更直接的是:
if(Clipboard.ContainsText())richTextBox1.Paste(DataFormats.GetFormat(DataFormats.Text))和设置
e.Handled=true适用于任一分支。您完全正确。你的方法更好。诚然,当我发布我的解决方案时,我怀疑它可以在不更换剪贴板的情况下实现,但我不知道具体如何实现。谢谢分享你的方法。我已经编辑了上面的答案,包括你的答案。这似乎只适用于QWERTY键盘。如果你有一个鼠标&一个上下文菜单或一个不同的键盘,这将如何工作?没有更高级或更抽象的方法来检测粘贴吗?我不是这方面的专家,但据我所知,RichTextBox控件不支持使用鼠标和右键单击上下文菜单进行粘贴。唯一的内置选项是使用CTRL-V进行粘贴。如果您有一个不同的控件支持从上下文菜单粘贴,那么我认为在这种情况下,您必须重写特定的事件处理程序。