在将文本粘贴到textview之前捕获文本

时间:2009-11-11 18:30:56

标签: c# linux mono gtk gtk#

我有一个textview,当从剪贴板粘贴某些内容时,我需要拦截该文本,并在文本视图结束之前对其进行一些预处理。

我试过听过“PasteClipboard”事件,它没有给我一个修改传入文本的方法。以及粘贴文本后触发的“textview.Buffer.Changed”事件使其进入textview。

提前致谢。

3 个答案:

答案 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);
    }
}