Domanda

Sto usando il DatePicker vaniglia in Silverlight 2. Mi legano la data selezionata ad un valore, e quando questo valore cambia ho pop un messagebox per confermare che vorrebbero cambiare il valore.

Per quanto strano comportamento ne consegue quando uso un messagebox subito dopo il valore del DatePicker è cambiato. popup del datepicker non si chiude, e se si mouse sul calendario che sarà scegliere una data senza dover fare clic del mouse.

Inoltre, dopo questo si verifica, sembra interessare attacchi e non si può impostare di nuovo la proprietà del modello di visualizzazione fino a quando la pagina viene ricaricata.

Il problema è piuttosto specifico in modo Ho attaccato un esempio di fascia bassa. Scegliere una data e premere OK, quindi spostare il mouse sopra il calendario a riprodurre questo.

Il mio XAML -

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

Il mio codice dietro -

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

Tutte le idee o soluzioni alternative?

È stato utile?

Soluzione

Hmm questo non è poi così raro in realtà. Un collega di mine recentemente ha incontrato problemi di molto strano in un'applicazione Windows Form, perché stava usando MessageBox in risposta all'evento clic una terza parte di controllo di menu (prima del menu era stato licenziato.)

Un suggerimento che non ha funzionato per lui, ma può benissimo lavorare per voi è quello di "spingere" la chiamata sul dispatcher. In questo modo il gestore SelectedDateChanged tornerà prima la finestra di messaggio in realtà viene mostrato.

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 paio di cose da tenere a mente, però:

  • MessageBox.Show è unico in Silverlight in quanto è uno dei pochi modi per creare una finestra di dialogo modale. E a differenza di Windows Form in cui il ciclo di messaggi è ancora in esecuzione, thread dell'interfaccia utente di Silverlight è bloccato fino a quando non ritorna.
  • L'evento avviene già dopo la data è cambiata quindi questo non è un buon modo per confermare la modifica. Una rapida occhiata ai documenti suggerisce non v'è un corrispondente evento "Modifica".
  • A seconda delle circostanze, si potrebbe solo essere meglio utilizzare un childWindow invece di MessageBox. Questo non avrebbe i problemi che hai descritto perché mentre sembra essere una finestra di dialogo modale, non lo è.

Altri suggerimenti

ho bloggato una soluzione QUI che rendere la finestra di messaggio non necessaria cambiando il flusso di lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top