ListBoxItem Template…

Wir haben hier für die ListBox ein eigenes Template gemacht, dass eben alle ListBoxen bei uns in der Anwendung gleich aussehen… dabei haben wir einfach das Beispiel aus der MSDN verwendet: ListBoxItem ControlTemplate Example

Eigentlich sollte man ja meinen, dass dies Beispiel zumindest einigermaßen funktioniert… leider weit gefehlt…

Das Problem ist: Sobald wir ein eigenes DataTemplate für spezielle Daten gemacht haben, hat ein Klick auf ein Element nur dann reagiert, wenn entweder genau auf den Rahmen des Items geklickt wurde oder genau auf den Text:
ListBoxItem

Es ist also relativ schwer z.B. das “!” genau zu treffen…wir haben ewig gesucht, bis wir endlich den Grund gefunden haben… (dank Franks Unterstützung haben wir es mittels Snoop und der Event-Ansicht gefunden): Der Border in dem ControlTemplate hat keine Hintergundfarbe. Somit ist der Border “durchsichtig” (bzw. “x:Null”), was dazu führt, dass ein Klick auf den Border nicht vom Border verarbeitet wird, sondern vom darunterliegenden Scroll-Container… und der macht natürlich hier nichts damit…
Hier ist auch ein Beispielprojekt (VS2008), damit man es mal selber probieren kann.

Für uns jetzt mal die Lösung: Wir setzen einfach die Hintergrundfarbe des Borders des ControlTemplates auf “Transparent”, dann wirken sich jetzt überall die Klicks auf die ListBox aus… danke an Hendrik für diesen Hinweis!

4 thoughts on “ListBoxItem Template…

  1. Mario

    Hi, das liegt an Eurem StackPanel im MyListBoxStyle. Wenn ihr dieses entfernt, wird der Border auch richtig “stretched” und das ganze Item ist selektierbar.

    Liebe Grüße
    Mario

    Reply
  2. Hendrik

    Another posibility is to set the background to transparent. This way it handles click events but remains invisible.

    Reply
  3. jkalmbach Post author

    @Mario: Das geht so nicht, da dann immer noch das Problem besteht, wenn Du _zwischen_ zwei Border drückst… dann passiert dort immer noch nichts…

    Reply
  4. jkalmbach Post author

    @Hendrik: Ja, das geht vermutlich. Man muss eben einen “Background” setzen, sonst geht es nicht; wenn man es so lässt wie im MSDN-Beispiel geht es auf jeden Fall nicht.

    Reply

Leave a Reply to Hendrik Cancel reply

Your email address will not be published. Required fields are marked *

Captcha *