2

前に、WPF TreeViewItem.Selected イベントをキャンセルする方法を尋ねました。

回答者は、代わりに、選択が行われる前に PreviewMouseDown イベントを処理することを提案しました。それは理にかなっている。

私はそれをやろうとしました...

XAML...

<TreeView Name="TreeViewThings"
    ...
    PreviewMouseDown="TreeViewThings_PreviewMouseDown"
    TreeViewItem.Expanded="TreeViewThings_Expanded"
    TreeViewItem.Selected="TreeViewThings_Selected" >

ビジュアルベーシック...

サブ TreeViewThings_PreviewMouseDown(...)
    If UnsavedChangesExist() その後
        e.Handled = UserCancelled()
    そうしないと
        e.Handled = False
    終了条件
サブ終了

関数 UnsavedChangesExist() をブール値として
    ...
終了機能

関数 UserCancelled() をブール値として
    Return MessageBox.Show("未保存の変更を破棄しますか?", _
                           "保存されていない変更", _
                           MessageBoxButton.OKCancel、_
                           MessageBoxImage.Question) = MessageBoxResult.Cancel
終了機能

これは一種の作業です...

  • 保存されていない変更がない場合は、問題なく続行され、TreeViewThings_Selected() が実行されます。

保存されていない変更がある場合、MessageBox が表示されます...

MessageBox: 続行して未保存の変更を破棄しますか? OK/キャンセル http://img25.imageshack.us/img25/141/discard2yk0.gif

  • 次にキャンセルを選択すると、キャンセルされます。

  • ただし、代わりに [OK] を選択して未保存の変更を破棄すると、e.Handled = False であってもキャンセルされます。続行して TreeViewThings_Selected() を実行しません。

MessageBox があるという事実は、どういうわけかそれを台無しにすると思います。

私は何を間違っていますか?

4

1 に答える 1

1

問題は、メッセージボックスが原因でツリーがフォーカスを失うことです。メッセージボックスが閉じられた後、フォーカスをツリーに戻そうとしましたか?

于 2010-09-17T18:14:10.183 に答える