none
UserControl => "Durchklicken" RRS feed

  • Frage

  • Hallo liebes Forum =D!

    Ich kenne mich schon halbwegs mit WPF aus, es ist jedoch mein erster Versuch ein Usercontrol zu basteln.

    Um direkt zum Problem zu kommen: 
    Ich habe ein Usercontrol  "X" mit einem StackPanel. In dieses StackPanel adde ich dynamisch weitere UserControls "X" usw.,  es soll eine Art visuelle Hierarchie entstehen.
    In jedem X soll der Hintergrund einen OnMouseClick Event behandeln, jedoch wenn ich ein "inneres" X anklicke wird immer der Event vom obersten Parent (visuell untersten Element) ausgeführt.

    Ich bin, denke ich, schon  alle Properties durchgegangen, google konnte auch nicht wirklich weiterhelfen.
    Wie kann ich das denn nun verhindern?

    Vielen Dank!
    Donnerstag, 20. Januar 2011 14:01

Antworten

  • Hallo auch,
    p.s. ich hoffe keiner verurteilt mich hier wegen dem (a, b) xD mach ich des öffteren wenn es schnell gehen soll :P
    nee, wieso denn auch - die Lambdas sind doch inzwischen durchaus verbreitet. Ich persönlich nutze sie selten, weil ich es halbwegs unübersichtlich finde. Aber sender/e kürzt man üblicherweise mit s/e - Dein a/b habe ich noch nie gesehen. :-)
    EDIT:

    Also, irgendwie klappt das doch nicht so wie ich es mir vorgestellt habe : (
    Wenn ich nun auf das UserControl einen Button plaziere und folgendes hinzufüge: 

            button1.PreviewMouseDoubleClick += (a, b) => {MessageBox.Show("button geklickt!"); };

    dann klicke ich doppelt auf den Button und bekomme eine Messagebox vom UserControl -und- vom Button, 

    bin ratlos X(

    Du musst unterscheiden zwischen Clicks, die von einem dafür designierten Control (wie dem Button) intern "geschluckt" (-> direct ) werden und solchen, für die die routing-strategy (-> tunnel / bubble ) unterstützt wird. Grundsätzlich nutzt man die Preview*-Events, um "einzugrätschen", bevor der übliche Standard greift.

    Soll heißen, definiere für Deinen Button einen regulären Click-handler, dann wird der Event auch dort abgehandelt und nicht weitergereicht. Im übrigen gilt für die Preview*-events (dort kannst Du notfalls auch einen Klick abarbeiten), dass Du explizit e.Handled=true ; setzen musst, um das Routing an der jew. Stelle abzubrechen, bzw. zu signalisieren, dass nicht weitergereicht werden soll.

    Schau Dir mal die MSDN zum Thema Routed Events an - die ist sehr gut gelungen.


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Samstag, 22. Januar 2011 09:45

Alle Antworten

  • Hallo auch,

    hast Du schon versucht, für die UC-Instanz in Deinem Window IsHitTestVisible="False" zu setzen ..?


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Donnerstag, 20. Januar 2011 16:02
  • Hi!

    Habe ich, hat dann die Klicks gar nicht mehr angenommen D=

    Vielen Dank für die Antwort!

    Donnerstag, 20. Januar 2011 16:27
  • Hallo nochmal,

    wie fängst Du den Click denn ab, bzw. wie sieht der dahinterliegende Code aus? Kannst Du ein (ggf. verkürztes) Beispiel dessen posten, was Du bislang so zusammengebastelt hast? Sprich, das UC und ein Window, ggf. mit Code.


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Donnerstag, 20. Januar 2011 16:33
  • Hallo!

    Hier mal ein viel einfacheres Beispiel als das erste ":D

    http://x7.to/50a2p2

    Einfach mal auf das Viereck im Hauptfenster Doppelklicken probieren,

    Vielen Dank!

    Donnerstag, 20. Januar 2011 17:00
  • Hallo auch,

    ich bin nach wie vor nicht sicher, ob ich verstehe, was Du erreichen möchtest. Wenn ich das so interpretiere, dass das UC den Doppelklick abfangen soll und dieser dann dort verarbeitet werden soll und nicht an den Parent weitergereicht werden soll, dann ersetze im UC mal die Zeile ...

    this.MouseDoubleClick += (a, b) => { MessageBox.Show("uc geklickt!"); };
    

    ... durch dies hier:

    this.PreviewMouseDoubleClick += (s, e) => { 
    	MessageBox.Show("uc geklickt!");
    	e.Handled = true;
    };
    
    

    Hintergrund ist, dass der Click vom UC nicht als "verarbeitet" signalisiert wird, daher wird er in der Hierarchie nach oben gereicht (bubbling-strategy) und schlägt auch in dem das UC umgebenden Container durch.

    Falls das nicht weiterhilft, müsstest Du nochmal präzisieren, was passieren soll, bzw. was nicht.


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Freitag, 21. Januar 2011 13:44
  • Hallo Olaf!

    Vielen, vielen Dank!

    Genau das habe ich gemeint!

     

    Bei Forms gab es ja nur den normalen MouseClick =D (der ja eigentlich schon damals ein PreviewMousekClick war wenn mans so nimmt)

    Jedenfalls ist mir jetzt alles klar, und eigentlich habe ich mir auch das jetzige MouseClick, das den Klick zum Parent leitet, schon vorher bei Forms gewünscht,

     

    Also vielen Dank und noch einen schönen Abend!

     

    p.s. ich hoffe keiner verurteilt mich hier wegen dem (a, b) xD mach ich des öffteren wenn es schnell gehen soll :P

     

    EDIT:

    Also, irgendwie klappt das doch nicht so wie ich es mir vorgestellt habe : (
    Wenn ich nun auf das UserControl einen Button plaziere und folgendes hinzufüge: 

            button1.PreviewMouseDoubleClick += (a, b) => {MessageBox.Show("button geklickt!"); };

    dann klicke ich doppelt auf den Button und bekomme eine Messagebox vom UserControl -und- vom Button, 

    bin ratlos X(

    Freitag, 21. Januar 2011 17:50
  • Hallo auch,
    p.s. ich hoffe keiner verurteilt mich hier wegen dem (a, b) xD mach ich des öffteren wenn es schnell gehen soll :P
    nee, wieso denn auch - die Lambdas sind doch inzwischen durchaus verbreitet. Ich persönlich nutze sie selten, weil ich es halbwegs unübersichtlich finde. Aber sender/e kürzt man üblicherweise mit s/e - Dein a/b habe ich noch nie gesehen. :-)
    EDIT:

    Also, irgendwie klappt das doch nicht so wie ich es mir vorgestellt habe : (
    Wenn ich nun auf das UserControl einen Button plaziere und folgendes hinzufüge: 

            button1.PreviewMouseDoubleClick += (a, b) => {MessageBox.Show("button geklickt!"); };

    dann klicke ich doppelt auf den Button und bekomme eine Messagebox vom UserControl -und- vom Button, 

    bin ratlos X(

    Du musst unterscheiden zwischen Clicks, die von einem dafür designierten Control (wie dem Button) intern "geschluckt" (-> direct ) werden und solchen, für die die routing-strategy (-> tunnel / bubble ) unterstützt wird. Grundsätzlich nutzt man die Preview*-Events, um "einzugrätschen", bevor der übliche Standard greift.

    Soll heißen, definiere für Deinen Button einen regulären Click-handler, dann wird der Event auch dort abgehandelt und nicht weitergereicht. Im übrigen gilt für die Preview*-events (dort kannst Du notfalls auch einen Klick abarbeiten), dass Du explizit e.Handled=true ; setzen musst, um das Routing an der jew. Stelle abzubrechen, bzw. zu signalisieren, dass nicht weitergereicht werden soll.

    Schau Dir mal die MSDN zum Thema Routed Events an - die ist sehr gut gelungen.


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Samstag, 22. Januar 2011 09:45