Pergunta

Estou usando o Vanilla DatePicker no Silverlight 2. Ligo a data selecionada a um valor e, quando esse valor muda, estou, coloco uma caixa de mensagem para confirmar que eles gostariam de alterar o valor.

No entanto, o comportamento estranho ocorre quando eu uso uma caixa de mensagem logo após o valor do DatePicker ser alterado. O pop -up do DatePicker não será fechado e, se você mouse sobre o calendário, ele escolherá uma data sem precisar clicar no mouse.

Além disso, depois disso ocorre, parece afetar as ligações e não pode definir a propriedade do modelo de exibição novamente até que a página seja recarregada.

Esse problema é bastante específico, então anexei um exemplo despojado. Escolha uma data e pressione OK e mova o mouse sobre o calendário para reproduzir isso.

Meu xaml -

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

Meu código atrás -

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

Alguma ideia ou solução alternativa?

Foi útil?

Solução

Hmm, isso não é tão incomum. Recentemente, um colega de trabalho encontrou problemas muito estranhos em um aplicativo do Windows Forms porque estava usando o MessageBox em resposta ao evento de clique de um menu de terceiros (antes do menu ser demitido.)

Uma sugestão que não funcionou para ele, mas pode muito bem trabalhar para você é "empurrar" a chamada para o despachante. Dessa forma, o seu manipulador selecionado de DataChanged retornará antes da A caixa de mensagem é realmente mostrada.

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

Algumas coisas a ter em mente:

  • MessageBox.Show é único no Silverlight, pois é uma das únicas maneiras de criar uma caixa de diálogo modal. E, diferentemente dos formulários do Windows, onde o loop da mensagem ainda está em execução, o thread da interface do usuário do Silverlight é paralisado até que ele retorne.
  • O evento já ocorre depois que a data foi alterada, portanto, essa não é uma boa maneira de confirmar a alteração. Um olhar superficial para os documentos sugere que não há um evento de "mudança" correspondente.
  • Dependendo das circunstâncias, você pode estar melhor usando uma WHIDWindow em vez de MessageBox. Isso não teria os problemas que você descreveu porque, embora pareça ser uma caixa de diálogo modal, não é.

Outras dicas

Eu escrevi uma solução alternativa AQUI Isso torna a caixa de mensagem desnecessária alterando o fluxo de trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top