Frage

Ich bin mit den Vanille-Datepicker in Silverlight 2. Ich das ausgewählte Datum auf einen Wert binden, und wenn die Wertänderungen ich ein messagebox Pop bestätigen, dass sie den Wert ändern möchten.

Doch seltsames Verhalten folgt, wenn ich einen messagebox gerade verwenden, nachdem die picker Wert geändert wird. Der Pop-up des Datepicker wird nicht schließen, und wenn Sie die Maus über den Kalender wird es ein Datum wählen, ohne die Maus zu klicken.

Auch nach dem in diesem Fall scheint es, Bindungen zu beeinflussen und es kann nach Ansicht Modell Eigentum nicht wieder eingestellt, bis die Seite neu geladen wird.

Dieses Problem ist sehr spezifisch, damit ich ein abgespeckte Beispiel angebracht habe. Wählen Sie ein Datum ein und drücken Sie OK und dann bewegen Sie die Maus über den Kalender, dies zu reproduzieren.

Meine XAML -

<Grid x:Name="LayoutRoot">
    <controls:DatePicker x:Name="dpTest" 
                         Height="25" 
                         Width="75" 
                         SelectedDateChanged="DatePicker_SelectedDateChanged" />
</Grid>

Mein Code hinter -

  Private Sub DatePicker_SelectedDateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
    MessageBox.Show("Test Popup")
End Sub

Irgendwelche Ideen oder Abhilfen?

War es hilfreich?

Lösung

Hmm das ist nicht alles, was wirklich ungewöhnlich. Ein Kollege von mir vor kurzem lief in sehr seltsame Probleme in einem Windows Forms-Anwendung, weil er MessageBox als Reaktion auf eine dritte Partei Menüsteuerung der Click-Ereignis mit wurde (bevor das Menü entlassen worden war.)

Ein Vorschlag, der nicht für ihn arbeiten, aber kann sehr gut für Sie ist es, „Push“ der Anruf auf den Dispatcher. Auf diese Weise Ihren SelectedDateChanged Handler zurück vor das Meldungsfeld wird tatsächlich gezeigt.

Private Sub DatePicker_SelectedDateChanged( ... )

    ' Unfortunately my VB is rusty '
    ' I believe this is the correct syntax. '
    Dispatcher.BeginInvoke(AddressOf ShowDateMessage)

    ' At this point, the message box has *not* been shown '
    ' It will be shown once control returns to the dispatcher '

End Sub

Private Sub ShowDateMessage()

    ' By this point, the DatePicker popup should be closed '
    ' so hopefully the issues you are seeing would be avoided '
    MessageBox.Show("Test Popup")

End Sub

Ein paar Dinge im Auge zu behalten, obwohl:

  • MessageBox.Show ist einzigartig in Silverlight, dass sie eine der wenigen Möglichkeiten, um ein modaler Dialog zu erstellen. Und im Gegensatz zu in Windows Forms, wo die Nachrichtenschleife noch läuft, Silverlight UI-Thread blockiert ist, bis er zurückkehrt.
  • Die Veranstaltung findet bereits nach dem Datum geändert hat, so ist dies kein guter Weg, um die Änderung zu bestätigen. Ein flüchtiger Blick auf die Dokumentation schlägt vor, es gibt keine entsprechenden „Ändern“ Ereignis.
  • Je nach den Umständen, können Sie nur besser dran, ein Childwindow statt MessageBox verwenden. Dies würde nicht die Probleme haben Sie beschrieben, denn während es erscheint einen modalen Dialog zu sein, ist es nicht.

Andere Tipps

Ich gebloggt eine Abhilfe HIER , dass die Message-Box überflüssig machen, indem Sie den Arbeitsablauf zu verändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top