我有一个textview,当从剪贴板粘贴某些内容时,我需要拦截该文本,并在文本视图结束之前对其进行一些预处理。
我试过听过“PasteClipboard”事件,它没有给我一个修改传入文本的方法。以及粘贴文本后触发的“textview.Buffer.Changed”事件使其进入textview。
提前致谢。
答案 0 :(得分:3)
AFAIK最好的选择是在插入文本后对其进行后处理 - TextBuffer上的InsertText事件具有告诉您插入文本的位置和大小的参数,因此您可以删除,处理和重新插入文本。你当然希望避免捕获1-char插入(击键)和你自己的重新插入,但这是微不足道的。
我能想到的唯一另一个选择是重新实现粘贴支持,通过捕获粘贴键命令,中键单击等等 - 但请注意,命令键可以在用户的gtkrc文件中被覆盖,因此实现这可能会变得毛茸茸。
在irc.gnome.org的#gtk + IRC频道中也可能值得一提。
答案 1 :(得分:1)
进行一些简短的Google搜索,我在Gtk.TextBuffer和 GTK alternative to .net WndProc in Mono上找到了以下文档。您可能希望将 [GLib.ConnectBefore] 属性添加到代码中以访问GTK的WndProc方法。上面的Beaner代码可能会对GTK框架稍作修改。
答案 2 :(得分:0)
这可能对您没有帮助,但我在实现TextBox的自定义控件中捕获WM_PASTE消息。我从剪贴板中获取GetText到一个字符串变量,如果它匹配我正在寻找的东西,我对变量进行更改并将.Text设置为我的变量并吞下事件,以便文本框得到它。如果它不是我想要的,但是允许我只用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);
}
}