DatePicker 문제를 확인하려면 MessageBox 팝업
-
19-09-2019 - |
문제
나는 Silverlight 2에서 바닐라 날짜 피커를 사용하고 있습니다. 선택한 날짜를 값으로 바인딩하고 해당 값이 변경되면 메시지 상자를 팝하여 값을 변경하고 싶는지 확인합니다.
그러나 DatePicker의 값이 변경된 후 바로 MessageBox를 사용하면 이상한 동작이 발생합니다. DatePicker의 팝업은 닫히지 않으며 캘린더를 통해 마우스를 마우스를 클릭하지 않고 날짜를 선택합니다.
또한, 이후에는 바인딩에 영향을 미치는 것으로 보이며 페이지가 다시로드 될 때까지보기 모델의 속성을 다시 설정할 수 없습니다.
이 문제는 다소 구체적이므로 제거 된 예제를 첨부했습니다. 날짜를 선택하고 확인을 누른 다음 캘린더 위로 마우스를 이동하여이를 재현하십시오.
내 xaml-
<Grid x:Name="LayoutRoot">
<controls:DatePicker x:Name="dpTest"
Height="25"
Width="75"
SelectedDateChanged="DatePicker_SelectedDateChanged" />
</Grid>
내 코드 뒤에 -
Private Sub DatePicker_SelectedDateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
MessageBox.Show("Test Popup")
End Sub
아이디어 나 해결 방법이 있습니까?
해결책
흠 이것은 실제로 드문 일이 아닙니다. 내 동료는 최근 Windows Forms 애플리케이션에서 매우 이상한 문제를 겪었습니다. 제 3 자 메뉴 컨트롤의 클릭 이벤트에 대한 응답으로 MessageBox를 사용하고 있었기 때문에 메뉴가 기각되기 전에).
그를 위해 효과가 없었지만 당신에게 잘 작동 할 수있는 한 가지 제안은 발송자에게 전화를 "밀기"하는 것입니다. 그렇게하면 선택한 DATECHANGED 핸들러가 반환됩니다 ~ 전에 메시지 상자가 실제로 표시됩니다.
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
명심해야 할 몇 가지 사항 :
- MessageBox.Show는 Modal 대화 상자를 만드는 유일한 방법 중 하나라는 점에서 Silverlight에서 고유합니다. 메시지 루프가 여전히 실행중인 Windows 형태와 달리 Silverlight의 UI 스레드는 반환 될 때까지 정체됩니다.
- 이벤트는 날짜가 변경 된 후에 이미 진행되므로 변경 사항을 확인하는 좋은 방법이 아닙니다. 문서를 한 눈에 볼 때 해당 "변경"이벤트가 없음을 시사합니다.
- 상황에 따라 MessageBox 대신 Childwindow를 사용하는 것이 좋습니다. 이 문제는 모달 대화 상자 인 것처럼 보이기 때문에 설명한 문제가 없습니다.
다른 팁
나는 해결 방법을 블로그에 올렸다 여기 작업 흐름을 변경하여 메시지 상자를 불필요하게 만듭니다.