Frage

Ich habe eine Textview und wenn etwas in ihn aus der Zwischenablage eingefügt wird, ich abfangen muß, dass Text und auf ihn eine gewisse Vorverarbeitung tun, bevor es in der Textview endet.

Ich habe auf das „PasteClipboard“ Ereignis versucht hören, die mir nicht einen Weg nicht gibt den eingehenden Text zu ändern. und das „textview.Buffer.Changed“ Ereignis, das ausgelöst wird, nachdem der eingefügten Text in die Textview macht.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

AFAIK Ihre beste Möglichkeit ist, den Text nachbearbeiten, nachdem es eingeführt worden ist - das Insert Ereignis auf dem TextBuffer hat Argumente, die die Position und die Größe des eingefügten Textes sagen, so dass Sie entfernen können, zu verarbeiten und wieder einsetzen. Sie würden natürlich wollen 1-char Einfügungen einklemmen (Tastenanschläge) und Ihre eigene Wieder Einfügungen, aber das ist trivial.

Die einzige andere Option, die ich denken kann, ist neu zu implementieren Unterstützung einfügen, durch den Fang des Schlüssel Befehl einfügen, die mittlere Maustaste, usw. - aber beachten Sie, dass die Befehlstasten in Benutzern gtkrc Dateien überschrieben werden können, so Umsetzung dies könnte richtig erhalten behaart.

Es könnte sich auch lohnen im gtk + IRC-Kanal auf irc.gnome.org # gefragt sein.

Andere Tipps

einige kurze googeln, fand ich die folgende Dokumentation auf Gtk.TextBuffer und GTK Alternative zu .net WndProc in Mono . Es scheint, dass Sie die [GLib.ConnectBefore] Attribut, um Ihren Code für den Zugriff GTK die WndProc Methode hinzufügen möchten. Beaner des Code oben würde wahrscheinlich Arbeit mit leichter Modifikation für den GTK-Framework.

Dies kann nicht eine Hilfe sein, aber ich bin fangen die WM_PASTE Nachricht in einem benutzerdefinierten Steuerelement, dass TextBox implementiert. Ich erhalte die GetText aus der Zwischenablage in eine String-Variable und wenn es passt, was ich suche ich meine Änderungen auf die Variable und setzen Sie die .Text meiner Variable und schlucken das Ereignis zu machen, so dass die Textbox Neer wird es. Wenn es nicht das, was ich suche, aber darf ich nur das Ereignis weitergeben mit base.WndProc (ref m).

Beispiel:

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top