[英]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.