Laden...

[gelöst] Kann mit MouseDown nur die mittlere Maustaste abfangen

Erstellt von der Gunnar vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.210 Views
D
der Gunnar Themenstarter:in
3 Beiträge seit 2008
vor 15 Jahren
[gelöst] Kann mit MouseDown nur die mittlere Maustaste abfangen

Hallo C#-Experten!

Obwohl in der Suche reichlich zu MouseEvents zu finden war, ist mein Problem wohl noch nicht aufgetaucht.

Ich habe eine Anwendung erstellt, welche links eine Liste von Elementen enthält und rechts eine Oberfläche, wo diese Elemente hingeschoben werden können. Jedoch habe ich ein Problem, denn, um das draggen starten zu können, muss ich das MouseDown-Event in der Liste (ein Stackpanel, wo ein Expander samt Inhalt drin ist) abfangen.
Jedoch komme ich sowohl mit der linken, als auch mit der rechten Maustaste niemals in die MouseDown-Funktion hinein. Jedoch wurde die Eventbeschreibung korrekt gemacht, da ich damit schon oft gearbeitet habe und die mittlere Maustaste ja funktioniert.

Folgender Beispielcode sollte das verdeutlichen:


        public Window1()
        {
            InitializeComponent();

            Expander exp = new Expander();
            exp.Header = "test";

            ListBox lb = new ListBox();
            IList<String> strList = new List<String>();
            strList.Add("el1");
            strList.Add("el2");
            strList.Add("el3");

            lb.ItemsSource = strList;
            lb.MouseDown += onMouseDown;
            lb.SelectionChanged += onSelChanged;

            exp.Content = lb;

            stackPanel1.Children.Add(exp);
        }

        public void onMouseDown(object sender, MouseEventArgs e)
        {
            // rechte und linke Maustaste kommt hier nicht rein
        }

        public void onSelChanged(object sender, SelectionChangedEventArgs e)
        {
            // funktioniert einwandfrei
        }

Mir kommt es so vor, als ob mir eine andere Funktion das LeftMouseDown- und RightMouseDown-Event klaut und nicht weiterreicht. Daher hab ich das simple Beispielprojekt erstellt, wo das Problem aber immer noch auftaucht.

Hat jemand eine Idee?

582 Beiträge seit 2008
vor 15 Jahren

Die Lösung ist recht einfach. In der Hilfe steht

Einige Steuerelemente weisen u. U. eine inhärente Klassenbehandlung für Maustastenereignisse auf. Das Drücken der linken Maustaste ist das Ereignis, das mit höchster Wahrscheinlichkeit über eine Klassenbehandlung in einem Steuerelement verfügt. Häufig wird das zugrunde liegende Mouse-Klassenereignis von der Klassenbehandlung als behandelt markiert. Wenn das Ereignis als behandelt markiert ist, werden andere Instanzhandler, die an das betreffende Element angefügt sind, nicht auf normale Weise ausgelöst. Andere Klassen- bzw. Instanzhandler, die in der Bubbling-Richtung zum Stamm der UI-Struktur an Elemente angefügt sind, werden ebenfalls nicht auf normale Weise ausgelöst.

Ergo nutzt du ein PreviewMouseDown.

Zudem du deine Ereignisse lieber so definieren solltest, da an sonsten Probele auftauchen können. Es könnten schwere Ausnahmefehler beim Auslösen auftreten, da du keine eigene Instanz erzeugst und so z.B. auch keine Threadsicherheit hast.


lb.PreviewMouseDown += new MouseButtonEventHandler(lb_PreviewMouseDown);
lb.MouseDown += new MouseButtonEventHandler(lb_MouseDown);

Gruß dat Tala

D
der Gunnar Themenstarter:in
3 Beiträge seit 2008
vor 15 Jahren

Vielen Dank für deine Antwort. Mit dem Preview funktioniert das.

Mir ist zwar noch nicht ganz der Sinn bzw. der Grund des Ganzen klar... wahrscheinlich kommt das Preview (wie der Name schon sagt) vor dem eigentlichen Event dran und arbeitet alles Andere ab. Jedoch versteh ich nicht, warum nicht einfach jedes registrierte MouseDown-Event abgearbeitet wird.

Wie auch immer... es funktioniert, ich bin glücklich und danke dir! 😁

EDIT:
Das mit dem Erstellen von neuen Eventinstanzen war mir neu; ich werde in Zukunft drauf achten. Der Resharper meldet an dieser Stelle reduntantes Delegate. Daher hab ich Derartiges immer weggelassen. Bist du dir sicher, dass der Compiler da im Zuge seiner Optimierungen nicht sowieso eine neue Instanz erstellen lässt?

582 Beiträge seit 2008
vor 15 Jahren

Das kann ich nicht mit sicherheit sagen. Ich habe nur schon bei einigen Events probleme gehabt, als ich es noch nicht so gemacht habe. Ging so weit, das der Rechner von allein neu gestartet hat oder nicht mehr ansprechbar war.

Gruß dat Tala