如何防止将系统剪贴板图像数据粘贴到WPF RichTextBox中

时间:2010-10-19 15:34:38

标签: c# wpf richtextbox clipboard

我目前有一些代码可以拦截所有剪切,复制和粘贴事件到WPF中的RichTextBox。这些设计用于删除除纯文本以外的所有内容,并且除了纯文本之外不允许粘贴(通过使用Clipboard.ContainsText()方法检查。)这似乎成功阻止了内部的所有此类操作表格。用户只能复制,剪切和粘贴文本,不允许使用图像/音频数据/随机垃圾。

但是,如果我使用PrintScreen功能,并将其粘贴到其中一个RichTextBox中,则会粘贴图像(不是想要的行为。)如果您尝试将此图像从一个RichTextBox粘贴到另一个RichTextBox,它会赢不要让你(理想的行为)。

我正在覆盖的命令是使用

完成的
// Command handlers for Cut, Copy and Paste commands.
            // To enforce that data can be copied or pasted from the clipboard in text format only.
            CommandManager.RegisterClassCommandBinding(typeof(MyRichTextBox),
                new CommandBinding(ApplicationCommands.Copy, new ExecutedRoutedEventHandler(OnCopy), 
                new CanExecuteRoutedEventHandler(OnCanExecuteCopy)));
            CommandManager.RegisterClassCommandBinding(typeof(MyRichTextBox),
                new CommandBinding(ApplicationCommands.Paste, new ExecutedRoutedEventHandler(OnPaste), 
                new CanExecuteRoutedEventHandler(OnCanExecutePaste)));
            CommandManager.RegisterClassCommandBinding(typeof(MyRichTextBox),
                new CommandBinding(ApplicationCommands.Cut, new ExecutedRoutedEventHandler(OnCut), 
                new CanExecuteRoutedEventHandler(OnCanExecuteCut)));

然后,在允许任何操作之前,OnCopy(etc)方法基本上检查是否存在文本。

这里似乎有两个剪贴板在工作,其中一个我没有限制/锁定。有没有人知道这方面的技术性,以及所有剪贴板活动(表格和系统)可以被有效锁定和定制的方式吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

对于用户来说可能有点不可原谅但你可以像粘贴和清除剪贴板之前那样简单。只需挂钩PreviewKeyDown(因为在KeyUp上它已被插入)并清除剪贴板,如果我们有一个图像并按Ctrl + V:

public Window1()
{
    InitializeComponent();

    _rtf.PreviewKeyDown += OnClearClipboard;
}

private void OnClearClipboard(object sender, KeyEventArgs keyEventArgs)
{
    if (Clipboard.ContainsImage() && keyEventArgs.Key == Key.V && (Keyboard.Modifiers & ModifierKeys.Control) != 0)
        Clipboard.Clear();
}

不是最好的解决方案,但它会做到这一点。

答案 1 :(得分:2)

实际上你不需要任何黑客攻击KeyDown事件(这不会阻止粘贴上下文菜单或拖放)。有一个特定的附加事件:DataObject.Pasting

XAML:

<RichTextBox DataObject.Pasting="RichTextBox1_Pasting" ... />

代码隐藏:

    private void RichTextBox1_Pasting(object sender, DataObjectPastingEventArgs e)
    {
        if (e.FormatToApply == "Bitmap")
        {
            e.CancelCommand();
        }
    }

它可以阻止所有形式的粘贴(Ctrl-V,右键单击 - &gt;粘贴,拖放)。

如果您想要比这更聪明,您还可以将DataObject替换为仅包含您要支持的格式的DataObject(而不是完全取消粘贴)。

答案 2 :(得分:0)

我认为如果您的目标只是允许粘贴纯文本,这可能是更好的方法:

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;
        }            
    }