Laden...

TreeNode automatisch ausklappen, wenn die Maus eine bestimmte Zeit darüber steht

Erstellt von MrMilk vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.824 Views
M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren
TreeNode automatisch ausklappen, wenn die Maus eine bestimmte Zeit darüber steht

Hallo,

dieses mal habe ich eine kleine Frage zu Timern und Events.

Und zwar möchte ich, dass wenn ich die Maus x Sekunden über einem TreeViewNode lasse, dass dann in einem TreeView der aktuelle Node aufgeklappt wird.

Mein Problem ist, dass ich nicht weiß, wie ich heraus bekomme, ob nun die x Sekunden vorbei sind...

Meine erste Idee war ein Sleep, aber dieses legt alles schlafen, als nicht so gut.

Dann dachte ich mir, man könnte es mit einem Thread lösen der sich den aktuellen konten merkt und nach x Sekunden nachschaut, ob die Maus noch über dem gleichen ist...

Ist dieses so gut gelöst oder geht man da anders vor?

Bin über jede Hilfe dankbar.

Viele Grüße
MM

998 Beiträge seit 2007
vor 15 Jahren

Du nimmst einfach einen Timer, erstellst den in der EventMethode (OnMouseHover z.B.) und sagst ihm, das er nach x sekunden auslösen soll und startest den Timer. Nun prüfst du jedes mal wenn MouseHover ausgelöst wird, ob bereits ein timer läuft und ob die Maus noch über demselben Item hovert (wenn nicht stopst du den timer). Wenn der Timer ausgelaufen ist, ruft er die Elapse-Methode auf und darin zeigst du dann deine Infos an.

Gruß David

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Hey,

alles klar, vielen Dank für die Antwort.
Aber muss ich die Timerklasse dafür ableiten oder gibt es da schon einpaar Sachen die vorgefertigt sind?

Viele Grüße
tim

Gelöschter Account
vor 15 Jahren

warum nutzt du nicht direkt mousehover? mousehover wird eh nur dann ausgelöst, wenn die mouse auf einem punkt auf dem control verweilt.

998 Beiträge seit 2007
vor 15 Jahren

In Windows.Forms gibt es eine Timer-Klasse die instanziierst du einfach und benutzt sie.

@Jack aber ich glaube da kann man die HoverZeit nicht vorgeben, oder?!?

Gruß David

Gelöschter Account
vor 15 Jahren

@Jack aber ich glaube da kann man die HoverZeit nicht vorgeben, oder?!?

korrekt. es wäre aber ziemlich unpraktisch, wenn man mehr zeit veranschlagt, da man dann beim benutzen dieses features ansonsten einschlafen würde.

998 Beiträge seit 2007
vor 15 Jahren

Evtl. solls ja auch weniger sein... KA

Gruß David

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

mmmh,

HoverHoverNode Klappt leider nur bei nicht gedrückter Maustaste, kennt ihr auch ein Event, dass bei gedrückter Maustaste so arbeitet?

Viele Grüße
MM

998 Beiträge seit 2007
vor 15 Jahren

WÜrde mir spontan keins einfallen, nein. Leite doch einfach von TreeView ab und implementier deine eigene Event-Verarbeitung. Aber ehrlich gesagt kann ich mir nicht vorstellen, das für so eine Anforderung (das die automatisch aufklappen wenn man mit gedrückter maustaste darüber fährt) nichts vorgefertigtes existiert.

Gruß David

5.299 Beiträge seit 2008
vor 15 Jahren

Hi!

Willst du etwas draggen, und dann soll der Treenode aufmachen, damit du da hinein-Dreaggen kannst?

Beim Draggen kommen die MouseMoves nicht beim Ziel-Control an, sondern beim Start-Control

Der frühe Apfel fängt den Wurm.

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Willst du etwas draggen, und dann soll der Treenode aufmachen, damit du da hinein-Dreaggen kannst?

Kannst du mir sagen, welche Events ich da abfangen muss? Bin jetzt verwirrt wegen dem StartControl 😦

Viele Grüße
MM

Gelöschter Account
vor 15 Jahren

ach du willst drag&drop mechanismen implementieren?

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Genau 🙂 Das habe ich auch schon so weit alles geschafft mit der Hilfe von diversen Seiten.

Allerdings bekomme ich dieses: "Knoten klappe auf, wenn Maus 3 Sekunden darüber ist" nicht hin...

Srry, ich dachte das wäre von der Art alles das gleiche, sonst hätte ich das sofort geschrieben...

Viele Grüße
MM

Gelöschter Account
vor 15 Jahren

und mit den drag&drop-events kommst du nciht weiter?

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Also verschieben etc klappt schon alles. habe mich an einem codeProject Projekt orientiert.

Mein Problem ist noch, wenn ich ein Element per am verschieben bin, öffnet sich der Ordener nicht.

Oft kenne ich es so, dass man mit dem dem Element was man gerade am verschieben ist, über einem Knoten (welcher noch weitere Konten unter sich hat) einfach ein paar Sekunden wartet und dann öffnet dieser sich.

Und das möchte ich auch haben.
Und mein Problem ist, dass ich nicht weiß wie ich das mit der Zeit mache... Weil ohne x Sekunden auf dem Knoten zu warten ist doof, da man ruck zuck bei einer Mausbewegung Teilbäume geöffnet hat, die man gar nicht offen haben wollte...

Versteht ihr grob was ich meine?

Viele Grüße
MM

Gelöschter Account
vor 15 Jahren

ich verstehe schon aber du hast meinen post nciht beantwortet.

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

und mit den drag&drop-events kommst du nciht weiter?

dann würde ich deine Frage mit ja beantworte.

Vielleicht sethe ich im Moment aber auch total auf dem Schlauch....

Viele Grüße
MM

Gelöschter Account
vor 15 Jahren

noch etwas.

es gibt das event NodeMouseHover. das wird eigendlcih ausgelöst, auch wenn der mousebutton in einem anderen control gedrückt wurde. in dem handler musst du nur noch den node von den eventargs expandieren.

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

NodeMouseHover

Leider löst das nicht bei gedrückter maustaste aus 😦

Hatte ich auch schon ausprobiert...

Viele Grüße
MM

Gelöschter Account
vor 15 Jahren

bei mir aber schon.....

Gelöschter Account
vor 15 Jahren

mach mal im dragover des zielcontrols:

TreeNode tn = myTargetTreeView.HitTest(myTargetTreeView.PointToClient(MousePosition)).Node;
            if(tn!=null)tn.Expand();
M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Hey JAck30lena,

das klappt 🙂 Zwar ohne Verzögerung aber es klappt 🙂

Ich habe das mit dem NodeMouseHover nochmal ausprobiert, dass klappt bei mir nur, wenn die Maus gedrückt ist 😦

Da du schon einmal im Thema bist, kannst du mir sagen, wie man das los lassen an bestimmten stellen verbieten kann?

Viele Grüße
MM

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Also ich habe das ganze gerade mal in die NodeMouseHover eingesetzt und da passiert leider nichts 😦

Viele Grüße
MM

Gelöschter Account
vor 15 Jahren
            TreeNode tn = treeView2.HitTest(treeView2.PointToClient(MousePosition)).Node;
            if(tn!=null)tn.Expand();
            e.Effect = (tn.Text == "nicht erwünschtes drop" ? DragDropEffects.None : DragDropEffects.Copy);//oder was auch immer
M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Hey,

so langsam klappt alles.
Vielen Dank für deine ausdauernde Hilfe.
Eine letzte Frage habe ich aber noch.

Wenn ich das Element in einen Bereich ziehe wo es nicht hin darf, macht Windows automatisch einen Kreis mit einem Strich durch.

Kannst du mir sagen, wie ich diese Curser Eigenschaft manuell setzten kann bzw. das gleiche verhalten (Normaler/Verbotener Zeiger...)?

Dass soll es dann aber nun endlich gewesen sein 🙂

Danke nochmals und viele Grüße
MM

Gelöschter Account
vor 15 Jahren
Cursor = Cursors.Arrow //oder was auch immer... schau dir die klasse cursors an.