我有一个textview,并且从剪贴板中将某些内容粘贴到该文本中时,我需要截取该文本并在文本视图中结束之前对其执行一些预处理。将文本粘贴到文本视图之前捕获文本
我试着听着“PasteClipboard”事件,它不给我一种修改传入文本的方法。和“textview.Buffer.Changed”事件,该事件在粘贴的文本进入textview后触发。
在此先感谢。
我有一个textview,并且从剪贴板中将某些内容粘贴到该文本中时,我需要截取该文本并在文本视图中结束之前对其执行一些预处理。将文本粘贴到文本视图之前捕获文本
我试着听着“PasteClipboard”事件,它不给我一种修改传入文本的方法。和“textview.Buffer.Changed”事件,该事件在粘贴的文本进入textview后触发。
在此先感谢。
AFAIK您最好的选择是在插入文本后对其进行后处理--TextBuffer上的InsertText事件有参数告诉您插入文本的位置和大小,因此您可以删除,处理并重新插入它。你当然想要避免捕获1个字符的插入(击键)和你自己的重新插入,但这是微不足道的。
我能想到的唯一其他选择是通过捕获粘贴键盘命令,中键单击等来重新实现粘贴支持 - 但请注意,命令键可以在用户的gtkrc文件中覆盖,所以正确实施这个可能会变得毛茸茸
在irc.gnome.org的#gtk + IRC频道中询问也许值得一试。
GTK中有没有类似于WndProc的东西?我有几年没有与Mono合作过,我承认,我对这个框架有些生疏。 – Chris 2009-11-19 21:34:27
不是我所知道的,没有。它基于事件(C语言中的“信号”)一路下降。 Windows/X/Carbon消息系统被GDK平台抽象隐藏。 – 2009-11-19 23:16:20
当然,即使有,你也需要一个“WM_PASTE”的等价物,这里TBH更是问题。 – 2009-11-19 23:18:12
这可能对您没有帮助,但我在实现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);
}
}
不幸的是,这并没有帮助我。我正在尝试在gtk下的linux上执行此操作。 – AvatarOfChronos 2009-11-16 03:01:14
应该从这个问题中删除c#标签吗? – jac 2009-11-19 21:28:38
不,这是C#。 GTK#是一个用于跨平台GTK +工具包的.NET/Mono包装,就像System.Windows.Forms是Win32 GUI的包装一样。 – 2009-11-19 23:13:38
做一些短google搜索,我发现Gtk.TextBuffer和 GTK alternative to .net WndProc in Mono下列文件。看起来您可能想要将[GLib.ConnectBefore]属性添加到您的代码中以访问GTK的WndProc方法。以上Beaner的代码可能适用于GTK框架的轻微修改。
GTK中没有WndProc的直接等价物。 – 2009-11-19 21:09:20
所以如果你使用Buffer.Changed,你确实看到修改后的版本出现之前修改前的文本会闪烁起来吗? – kdt 2009-11-11 22:13:29
不幸的是,在buffer.changed被触发时,我试图捕获的文本已经被放入了文本缓冲区。 – AvatarOfChronos 2009-11-18 16:50:29