WPF: Bricht MessageBox PreviewMouseDown?

8

Ich habe versucht, meine WPF-Anwendung dazu zu bringen, Benutzer dazu aufzufordern, ihre nicht gespeicherten Änderungen entweder zu verwerfen oder abzubrechen, wenn sie mit einem TreeView navigieren.

Ich glaube, ich habe einen Fehler gefunden. Die MessageBox spielt nicht gut mit PreviewMouseDown. Es scheint einen Klick zu "handhaben", unabhängig davon, wie e.Handled gesetzt ist, wenn eine MessageBox angezeigt wird.

Für dieses XAML ...

%Vor%

... vergleiche diese alternativen Methoden ...

%Vor%

Diese beiden Methoden verhalten sich unterschiedlich. Ohne die MessageBox wird TreeViewNodes_Selected() oder TreeViewThings_Expanded() ausgeführt. Mit der MessageBox werden sie nicht.

Ist das ein Fehler oder geht hier etwas vor, das ich verstehen sollte?

    
Zack Peterson 13.02.2009, 15:38
quelle

2 Antworten

2

Ich habe genau das gleiche Problem, und Sie haben recht, wenn Sie meinen, dass MessageBox Probleme macht. Um ehrlich zu sein, hatte ich andere Probleme mit MessageBox während der Arbeit mit Windows Forms, bevor ich zu WPF wechselte. Vielleicht ist es nur ein hundertjähriger Fehler, der ein Feature wurde (wie es oft bei Microsoft ist)?

In jedem Fall ist die einzige Lösung, die ich Ihnen anbieten kann, diejenige, die für mich funktioniert hat. Ich hatte Probleme, eine ähnliche Situation zu bekommen, um mit einer ListBox zu arbeiten - wenn es Änderungen an den Daten im Formular gab, wenn sich die Auswahl der ListBox änderte (entweder durch Klicken auf ein neues Element oder mit den Tasten "Up" oder "Down"), Ich bot dem Benutzer eine Auswahl in der MessageBox an, ob er speichern, verwerfen oder abbrechen soll.

Natürlich funktioniert die direkte Verwendung der ListBox MouseDown- oder PreviewMouseDown-Ereignisse nicht gut mit einer MessageBox. Hier ist, was funktioniert hat.

Ich habe eine Datenvorlage, um Elemente in meiner ListBox anzuzeigen (ich erwarte fast, dass Sie dasselbe haben):

%Vor%

Beachten Sie, dass ich die Ereignishandler KeyDown und MouseDown stattdessen auf das TextBlock-Steuerelement verschoben habe. Ich behielt den gleichen Code-Behind:

%Vor%

Als Randnotiz ist es seltsam, wie die Bindung meine DataRows immer als geändert markiert, wenn sich das ausgewählte Element in der ListBox, das ItemsSource an eine DataTable gebunden hat, ändert (ich weiß nicht, ob Sie DataTables / Sets verwenden) . Um das zu bekämpfen, verwerfe ich alle unbehandelten Änderungen, sobald die Auswahl bereits geändert wurde (weil ich alles behandle, was in dem vorher aufgetretenen Ereignis MouseDown notwendig ist):

%Vor%

Und der Code-Behind für den Handler:

%Vor%     
Alexandra 30.03.2009 19:41
quelle
0

Das ist, was ich habe. Es funktioniert, ist aber weniger wünschenswert ...

%Vor%

Dies erfordert, dass der Benutzer auf "OK" klickt, manuell auf eine Schaltfläche "Änderungen verwerfen" (in der Nähe der Schaltfläche "Speichern") klickt und durch ein weiteres "Bist du sicher?" Meldungsfeld und navigieren Sie dann erst wieder mit dem Baum.

    
Zack Peterson 30.03.2009 22:44
quelle

Tags und Links