Frage

Gibt es eine Möglichkeit, MouseDown auch über das .NET 2.0-TextBox-Steuerelement zu erfassen?Ich weiß, dass die geerbte Control-Klasse über das Ereignis verfügt, aber es wird in TextBox nicht angezeigt.Gibt es eine Möglichkeit, den Event-Handler zu überschreiben?

Ich habe auch das OpenNETCF TextBox2-Steuerelement ausprobiert, bei dem das MouseDown-Ereignis verfügbar gemacht wird, aber egal was ich tue, es löst den Handler nicht aus.

Irgendwelche Vorschläge?


Was für ein verrücktes mobiles Gerät haben Sie eine Maus?:) :)

Ja, Windows Mobile verfügt nicht über eine echte Maus, aber Sie irren sich, dass Windows Mobile .NET die Mausereignisse nicht unterstützt.Ein Klick oder eine Bewegung auf dem Bildschirm wird weiterhin als „Maus“-Ereignis betrachtet.Dies wurde auf diese Weise durchgeführt, damit der Code problemlos von Voll-Windows portiert werden konnte.Und dies ist kein Windows Mobile-spezifisches Problem.Das TextBox-Steuerelement unter Windows verfügt ebenfalls nicht über native Mausereignisse.In diesem Fall habe ich zufällig Windows Mobile verwendet.

Bearbeiten:Und nebenbei bemerkt: Da Windows Mobile auf dem WindowsCE-Kern basiert, der oft für eingebettete Desktop-Systeme und Slim Terminal Services-Clients oder „WinTerms“ verwendet wird, unterstützt es eine Hardware-Maus und das schon seit langem.Die meisten Geräte verfügen einfach nicht über die entsprechenden Anschlüsse.


Laut dem .NET -Framework wird der MouseDown -Event -Handler auf einer Textbox unterstützt.Was passiert, wenn Sie versuchen, den Code auszuführen?

Eigentlich gibt es das nur, weil es es von „Control“ erbt, wie es auch der Fall ist jeden andere Formularsteuerung.Es wird jedoch in der TextBox-Klasse überschrieben (und, glaube ich, in „privat“ geändert).Daher wird es in IntelliSense in Visual Studio nicht angezeigt.

Sie können den Code jedoch tatsächlich schreiben:

textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown);

und es lässt sich problemlos kompilieren und ausführen. Das einzige Problem besteht darin, dass textBox1_MouseDown() nicht ausgelöst wird, wenn Sie auf das TextBox-Steuerelement tippen.Ich gehe davon aus, dass das daran liegt, dass das Ereignis intern überschrieben wird.Ich möchte nicht einmal ändern, was intern mit dem Ereignis geschieht, sondern lediglich meinen eigenen Ereignishandler zu diesem Ereignis hinzufügen, damit ich wie bei jedem anderen Ereignis benutzerdefinierten Code auslösen kann.

War es hilfreich?

Lösung

Sieht so aus, als hättest du recht.Schade.Kein MouseOver-Ereignis.

Einer der Fallbacks, der jedoch immer mit .NET funktioniert, ist P/Invoke.Jemand hat sich bereits die Zeit genommen, dies für die .NET CF TextBox zu tun.Ich habe das auf CodeProject gefunden:

http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx

Hoffe das hilft

Andere Tipps

Ich weiß, dass diese Antwort viel zu spät kommt, aber ich hoffe, dass sie für jemanden nützlich ist, der sie findet.Außerdem habe ich es mir nicht ganz selbst ausgedacht.Ich glaube, ich habe die meisten Informationen ursprünglich auf den OpenNETCF-Boards gefunden, aber was unten eingegeben wird, stammt aus einer meiner Anwendungen.

Sie können ein Mousedown-Ereignis erhalten, indem Sie die OpenNETCF.Windows.Forms.IMessageFilter-Schnittstelle implementieren und an den Nachrichtenfilter Ihrer Anwendung anhängen.

static class Program {
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter();
    public static void Main() {
        Application2.AddMessageFilter(mudFilter);
        Application2.Run(new MainForm());
    }
}

So könnten Sie den MouseUpDownFilter implementieren:

public class MouseUpDownFilter : IMessageFilter {
    List ControlList = new List();

    public void WatchControl(Control buttonToWatch) {
        ControlList.Add(buttonToWatch);
    }

    public event MouseEventHandler MouseUp;
    public event MouseEventHandler MouseDown;

    public bool PreFilterMessage(ref Microsoft.WindowsCE.Forms.Message m) {
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;

        // If the message code isn't one of the ones we're interested in
        // then we can stop here
        if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) {
            return false;
        }

        //  see if the control is a watched button
        foreach (Control c in ControlList) {
            if (m.HWnd == c.Handle) {
                int i = (int)m.LParam;
                int x = i & 0xFFFF;
                int y = (i >> 16) & 0xFFFF;
                MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 1, x, y, 0);

                if (m.Msg == WM_LBUTTONDOWN)
                    MouseDown(c, args);
                else
                    MouseUp(c, args);

                // returning true means we've processed this message
                return true;
            }
        }
        return false;
    }
}

Jetzt löst dieser MouseUpDownFilter ein MouseUp/MouseDown-Ereignis aus, wenn es in einem überwachten Steuerelement auftritt, beispielsweise in Ihrem Textfeld.Um diesen Filter zu verwenden, fügen Sie einige überwachte Steuerelemente hinzu und weisen sie den Ereignissen zu, die im Ladeereignis Ihres Formulars ausgelöst werden könnten:

private void MainForm_Load(object sender, EventArgs e) {
    Program.mudFilter.WatchControl(this.textBox1);
    Program.mudFilter.MouseDown += new MouseEventHandler(mudFilter_MouseDown);
    Program.mudFilter.MouseUp += new MouseEventHandler(mudFilter_MouseUp);
}

void mudFilter_MouseDown(object sender, MouseEventArgs e) {
    if (sender == textBox1) {
        // do what you want to do in the textBox1 mouse down event :)
    }

}

Fair genug.Sie wissen wahrscheinlich mehr als ich über Windows Mobile.:) Ich habe gerade angefangen, dafür zu programmieren.Aber in regulären WinForms können Sie die OnXxx-Ereignishandlermethoden beliebig überschreiben.Ein kurzer Blick in Reflector mit der CF zeigt, dass Control, TextBoxBase und TextBox Sie nicht daran hindern, den OnMouseDown-Ereignishandler zu überschreiben.

Hast du das schon probiert?:

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        //do something specific here
        base.OnMouseDown(e);
    }
}

Gibt es ein „OnEnter“-Ereignis, das Sie stattdessen erfassen könnten?

Es würde vermutlich auch erfassen, wenn Sie mit der Tabulatortaste in das Textfeld navigieren und das Textfeld durch Tippen/Klicken aufrufen. Wenn das jedoch kein Problem darstellt, ist dies möglicherweise eine einfachere Lösung

Laut .Net Framework ist das MouseDown-Ereignishandler für eine TextBox wird unterstützt.Was passiert, wenn Sie versuchen, den Code auszuführen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top