Question

J'utilise le datepicker de vanille dans Silverlight 2. Je lie la date sélectionnée à une valeur, et lorsque cette valeur change je pop messageBox pour confirmer qu'ils aimeraient changer la valeur.

comportement si étrange s'ensuit quand j'utilise un messagebox juste après la valeur du datepicker est modifiée. Le pop-up de datepicker ne fermera pas, et si vous la souris sur le calendrier il choisira une date sans avoir à cliquer sur la souris.

En outre, après cela se produit, il semble affecter les liaisons et il ne peut pas régler à nouveau la propriété du modèle de vue jusqu'à ce que la page est rechargée.

Ce problème est assez spécifique, donc je joins un exemple dépouillé. Choisissez une date et appuyez sur OK puis déplacez votre souris sur le calendrier pour reproduire cela.

Mon XAML -

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

Mon code derrière -

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

Toutes les idées ou solutions de contournement?

Était-ce utile?

La solution

Hmm ce n'est pas si rare en fait. Un collègue de travail de la mine a récemment couru dans des problèmes très étranges dans une application Windows Forms parce qu'il utilisait MessageBox en réponse à un tiers cliquez sur l'événement de commande du menu (avant que le menu avait été rejeté.)

Une suggestion qui n'a pas fonctionné pour lui, mais peut très bien travailler pour vous est de « pousser » l'appel sur le répartiteur. De cette façon, votre gestionnaire SelectedDateChanged retournera avant la boîte de message est effectivement montré.

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

Un couple de choses à garder à l'esprit que:

  • MessageBox.Show est unique dans Silverlight en ce qu'elle est l'une des seules façons de créer une boîte de dialogue modale. Et contrairement à Windows Forms où la boucle de message est toujours en cours d'exécution, le thread d'interface utilisateur de Silverlight est bloqué jusqu'à ce qu'il revienne.
  • L'événement a déjà lieu après la date a changé si ce n'est pas une bonne façon de confirmer le changement. Un coup d'œil rapide sur la documentation suggère qu'il n'y a pas un événement « Modification » correspondant.
  • Selon les circonstances, vous pourriez être mieux d'utiliser un ChildWindow au lieu de MessageBox. Ce ne serait pas les problèmes que vous décrivez, car alors qu'il semble être une boîte de dialogue modale, ce n'est pas.

Autres conseils

Je blogué une solution de contournement ICI qui rendent la boîte de message inutile en changeant le flux de travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top