繁体   English   中英

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

[英]How can I prevent system clipboard image data being pasted into a WPF RichTextBox

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

但是,如果我使用PrintScreen函数并将其粘贴到RichTextBoxes之一中,则将图像粘贴到其中(而不是所需的行为。)但是,如果您尝试将此图像从一个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)方法本质上会在允许任何操作之前检查仅文本存在。

这里似乎有两个剪贴板在工作,其中一个不是我要限制/锁定。 有谁知道它的技术性,以及可以有效锁定和自定义所有剪贴板活动(窗体和系统)的任何方式吗?

提前致谢。

实际上,您不需要像捕获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,右键单击->粘贴,拖放)。

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

对于用户来说可能有点宽容,但是您可以像在粘贴之前劫持并清除剪贴板一样简单。 只需钩住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();
}

不是最巧妙的解决方案,而是可以解决的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM