2009-11-11 114 views
3

我有一个textview,并且从剪贴板中将某些内容粘贴到该文本中时,我需要截取该文本并在文本视图中结束之前对其执行一些预处理。将文本粘贴到文本视图之前捕获文本

我试着听着“PasteClipboard”事件,它不给我一种修改传入文本的方法。和“textview.Buffer.Changed”事件,该事件在粘贴的文本进入textview后触发。

在此先感谢。

+0

所以如果你使用Buffer.Changed,你确实看到修改后的版本出现之前修改前的文本会闪烁起来吗? – kdt 2009-11-11 22:13:29

+0

不幸的是,在buffer.changed被触发时,我试图捕获的文本已经被放入了文本缓冲区。 – AvatarOfChronos 2009-11-18 16:50:29

回答

3

AFAIK您最好的选择是在插入文本后对其进行后处理--TextBuffer上的InsertText事件有参数告诉您插入文本的位置和大小,因此您可以删除,处理并重新插入它。你当然想要避免捕获1个字符的插入(击键)和你自己的重新插入,但这是微不足道的。

我能想到的唯一其他选择是通过捕获粘贴键盘命令,中键单击等来重新实现粘贴支持 - 但请注意,命令键可以在用户的​​gtkrc文件中覆盖,所以正确实施这个可能会变得毛茸茸

在irc.gnome.org的#gtk + IRC频道中询问也许值得一试。

+0

GTK中有没有类似于WndProc的东西?我有几年没有与Mono合作过,我承认,我对这个框架有些生疏。 – Chris 2009-11-19 21:34:27

+0

不是我所知道的,没有。它基于事件(C语言中的“信号”)一路下降。 Windows/X/Carbon消息系统被GDK平台抽象隐藏。 – 2009-11-19 23:16:20

+0

当然,即使有,你也需要一个“WM_PASTE”的等价物,这里TBH更是问题。 – 2009-11-19 23:18:12

0

这可能对您没有帮助,但我在实现TextBox的自定义控件中捕获WM_PASTE消息。我从剪贴板中获取GetText到一个字符串变量,如果它匹配我正在寻找的东西,我对变量进行更改,并将.Text设置为我的变量并吞下事件,以便textbox neer获取它。如果它不是我正在寻找的东西,但是我可以通过base.WndProc(ref m)传递事件。

样品:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_PASTE) 
    { 
     string clipboardVin = Clipboard.GetText(); 
     string newVin = ""; 
     if (SelectionLength > 0) 
     { 
      newVin = Text.Replace(SelectedText, ""); 
     } 
     else 
     { 
      newVin = Text; 
     } 
     newVin = newVin.Insert(SelectionStart, clipboardVin); 
     if (!vinRegEx.IsMatch(newVin)) 
     { 
      m.Result = new IntPtr(Convert.ToInt32(true)); 
      MessageBox.Show("The resulting text is not a valid VIN.", "Can Not Paste", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
    else 
    { 
     base.WndProc(ref m); 
    } 
} 
+0

不幸的是,这并没有帮助我。我正在尝试在gtk下的linux上执行此操作。 – AvatarOfChronos 2009-11-16 03:01:14

+0

应该从这个问题中删除c#标签吗? – jac 2009-11-19 21:28:38

+1

不,这是C#。 GTK#是一个用于跨平台GTK +工具包的.NET/Mono包装,就像System.Windows.Forms是Win32 GUI的包装一样。 – 2009-11-19 23:13:38

1

做一些短google搜索,我发现Gtk.TextBuffer GTK alternative to .net WndProc in Mono下列文件。看起来您可能想要将[GLib.ConnectBefore]属性添加到您的代码中以访问GTK的WndProc方法。以上Beaner的代码可能适用于GTK框架的轻微修改。

+1

GTK中没有WndProc的直接等价物。 – 2009-11-19 21:09:20