2010-10-19 42 views
2

我目前有一些代码拦截所有剪切,复制和粘贴事件到WPF中的RichTextBox。这些设计是为了除去纯文本以外的所有内容,并且除了纯文本之外不允许粘贴(通过使用检查Clipboard.ContainsText()方法)。这似乎可以成功地阻止内的所有操作。用户只能复制,剪切和粘贴文字,图像/音频数据/随机垃圾不被允许。但是,如果我使用PrintScreen函数并将其粘贴到其中一个RichTextBoxes中,则图像将被粘贴(而不是想要的行为)。如果您尝试将此图像从一个RichTextBox粘贴到另一个RichTextBox,但它不会让你(期望的行为)。我怎样才能防止系统剪贴板图像数据被粘贴到WPF 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(等)方法完成的,然后基本上检查,只有文字是允许的任何操作之前存在。

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

在此先感谢。

回答

2

这对用户来说可能有点不可饶恕,但您可以像粘贴之前一样简单地进行劫持并清除剪贴板。只需勾PreviewKeyDown(因为在KEYUP it's已经插入),并清除剪贴板如果we've得到的图像,并按下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(); 
} 

不是最巧妙的解决方案,但稍后即做招。

+0

可能是一个愚蠢的问题,但这样做只会影响键按压的程序,还是会影响系统其他部分的所有按键组合?我只是不想中断用户对系统其他部分的意外操作! :) – Smallgods 2010-10-20 07:43:03

+0

用这种方法进行实验,它完美的工作!我没有想过从这个角度来看待它,所以谢谢:)留下我的方法,因为它有助于按照我的意愿设置文本的格式,但是您的建议可以修复我遇到的最后一个问题。再次欢呼! – Smallgods 2010-10-20 07:54:35

+0

很高兴帮助!它会影响系统,如果你试图将打印过的图像粘贴到rtf中,它将会丢失,否则,只要你只在rtf上捕捉预览图像,它应该只做这个,只要你的RTF盒子专注。如果你的窗户没有专注,我保证它不会陷入事件。 – Almund 2010-10-20 08:31:04

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键,右击 - >粘贴,拖放)。

如果你想变得更聪明,你也可以用只包含你想要支持的格式(而不是完全取消粘贴)的DataObject替换它。

+1

你也可以做一些像'e.FormatToApply = DataFormats.Text;'(这限制了粘贴到未格式化的文本) – 2016-11-08 10:00:28

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; 
     }    
    } 
相关问题