.NET C # MouseGeben Sie den Listener in ein Control WITH Scrollbar ein

8

Solange sich die Maus über einem bestimmten Steuerelement befindet, zeigen wir eine Form an. Wenn die Maus das Steuerelement verlässt, wird das Steuerelement nach einer kurzen Zeitüberschreitung ausgeblendet. Dies ist das Standard-Hover-Verhalten.

Wenn jedoch ein Steuerelement (z. B. eine Treeview) über eine Bildlaufleiste verfügt und die Maus auf oder über der Bildlaufleiste ist, werden die Ereignisse nicht ausgelöst ...

Wenn wir einen Verweis auf das Bildlaufleisten-Steuerelement erhalten könnten, würde dies unser Problem lösen, da wir dieselben Listener-Ereignisse zur Bildlaufleiste hinzufügen würden. Wie dem auch sei, ist die Bildlaufleiste nicht verfügbar ...

Wie können wir dieses Problem lösen?

    
Run CMD 09.06.2010, 12:47
quelle

2 Antworten

3

Die Bildlaufleiste befindet sich im Nicht-Client-Bereich der Strukturansicht. Wenn sich die Maus dorthin bewegt, beginnt sie, Nicht-Client-Nachrichten wie WM_NCMOUSEMOVE und WM_NCMOUSELEAVE zu erzeugen. Sie müssten die TreeView sub-class und überschreiben WndProc (), um diese Nachricht zu erkennen.

Dies löst Ihr Problem allerdings nicht wirklich, Sie werden es immer noch schwer haben mit Randfällen. Ein Low-Tech-Ansatz mit einem Timer funktioniert immer:

%Vor%     
Hans Passant 09.06.2010, 13:41
quelle
2

Ich denke, es gibt verschiedene Möglichkeiten, dies zu tun, aber der Schlüssel ist Ihr Wunsch, eine Auszeit für die Aktion zu haben. Ich denke, eine Kombination von zwei Techniken könnte funktionieren:

Platzieren Sie das Steuerelement in einem angedockten Bereich, und verwenden Sie den MouseEnter des Bereichs, um Ihr Verhalten einzuschalten. Dazu gehört auch die Bildlaufleiste des Steuerelements. Sie können auch das MouseLeave-Ereignis des Bedienfelds verwenden. Sie müssen jedoch die Position des Cursors überprüfen, um sicherzustellen, dass er nicht in das enthaltene Steuerelement verschoben wurde. Diese Methode ist meist zuverlässig, aber wenn Sie die Maus schnell bewegen, kann das verwirren.

Wenn Sie dies mit einem Timer kombinieren, der startet, wenn Ihr angezeigtes / verdecktes Steuerelement angezeigt wird, und überprüfen Sie die Cursorposition in regelmäßigen Abständen. Dies funktioniert, aber Ihr Timeout vor dem Ausblenden des Steuerelements ist nicht unbedingt konsistent (weil der Zeitgeber beim Eingeben des Steuerelements gestartet wird). Sie können den Timer auf Mausbewegungen im Steuerelement stoppen / starten, um dies etwas zu lindern.

Ich habe ein Projekt mit den verschiedenen Methoden zusammengestellt, die ich hier versucht habe: Ссылка

Wenn Sie das Steuerelement, das Sie im Bedienfeld verfolgen möchten, andocken, wird es im Wesentlichen umschlossen und Sie erhalten MouseEnter ganz am Rand des verfolgten Steuerelements:

%Vor%

Sie verfolgen die Eingabe in das Feld um das Steuerelement herum und verlassen dieses Fenster, sofern sich der Cursor nicht innerhalb des verfolgten Steuerelements befindet.

Um eine bessere "Verlassen" -Erfahrung zu erhalten, wird es mit einem Timer kombiniert, der überprüft, wo sich der Cursor befindet:

%Vor%     
Ragoczy 09.06.2010 13:22
quelle

Tags und Links