2009-02-12 96 views
2

早些時候我問了how to cancel a WPF TreeViewItem.Selected event如何正確處理帶有MessageBox確認的PreviewMouseDown事件?

的應答者建議我,而不是處理PreviewMouseDown事件的選擇,甚至發生之前。這就說得通了。

我一直試圖做...

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 

這只是排序的工作...

  • 如果沒有未保存的變化,那麼它只進行fin e並執行TreeViewThings_Selected()。

如果有未保存的更改,然後我看到的MessageBox ...

MessageBox: Continue and discard your unsaved changes? OK/Cancel http://img25.imageshack.us/img25/141/discard2yk0.gif

  • 如果我當時選擇取消,它取消。

  • 但是,如果我不是選擇確定放棄我的未保存的更改,那麼它只是取消反正 - 即使e.Handled =假。它不會繼續並執行TreeViewThings_Selected()。

我想事實上有一個MessageBox以某種方式將其擰緊。

我在做什麼錯?

+0

有您通過預覽按下鼠標在調試器處理程序踩,看它是否正在工作,你的預期?你應該能夠看到e.Handled是否被設置爲真/假和何時。如果是,你知道盒子有問題。 – 2009-02-13 12:57:00

回答

1

的問題是,這些URL會導致你的樹失去焦點。消息框被解散後,您是否嘗試將焦點設置回樹?