wpf - ¿Cómo manejo adecuadamente un evento PreviewMouseDown con una confirmación MessageBox?
treeview savechanges (1)
El problema es que el cuadro de mensaje hace que su árbol pierda el foco. ¿Has intentado volver a establecer el foco en el árbol después de que se desactive el cuadro de mensaje?
Antes le pregunté cómo cancelar un evento WPF TreeViewItem.Selected .
Los contestadores sugirieron que manejara el evento PreviewMouseDown antes de que la selección se llevara a cabo. Eso tiene sentido.
He intentado hacer eso ...
XAML ...
<TreeView Name="TreeViewThings"
...
PreviewMouseDown="TreeViewThings_PreviewMouseDown"
TreeViewItem.Expanded="TreeViewThings_Expanded"
TreeViewItem.Selected="TreeViewThings_Selected" >
Visual Basic ...
Sub TreeViewThings_PreviewMouseDown(...) If UnsavedChangesExist() Then e.Handled = UserCancelled() Else e.Handled = False End If End Sub Function UnsavedChangesExist() As Boolean ... End Function Function UserCancelled() As Boolean Return MessageBox.Show("Discard your unsaved changes?", _ "Unsaved Changes", _ MessageBoxButton.OKCancel, _ MessageBoxImage.Question) = MessageBoxResult.Cancel End Function
Esto es solo una especie de trabajo ...
- Si no hay cambios no guardados, procede muy bien y ejecuta TreeViewThings_Selected ().
Si hay cambios no guardados, entonces veo el MessageBox ...
MessageBox: ¿Continuar y descartar los cambios no guardados? Aceptar / Cancelar http://img25.imageshack.us/img25/141/discard2yk0.gif
Si luego selecciono Cancelar, se cancela.
Sin embargo, si, en cambio, elijo Aceptar para descartar mis cambios no guardados, entonces se cancela de todos modos, aunque e.Handled = False. No continúa y ejecuta TreeViewThings_Selected ().
Creo que el hecho de que haya un MessageBox lo estropea de alguna manera.
¿Qué estoy haciendo mal?