locked
LightSwitch | MessageBox を出しても Screen が閉じられるのをキャンセルするには RRS feed

  • 質問

  • 下記コードで Screen が閉じられるのをキャンセルできたのですが、


    partial void SearchBs_Closing(ref bool cancel)
    {
    	//this.ShowMessageBox("closing"); ........................ (1)
    	cancel = true;
    }


    (1) の ShowMessageBox() を追加すると、
    キャンセルが効かず Screen が閉じてしまいます。





    ShowMessageBox() を使いながらも、
    Screen が閉じられるのをキャンセルするにはどうしたらいいのでしょう?


    • 編集済み custar 2012年3月9日 9:44
    2012年3月9日 9:32

回答

すべての返信

  • こんにちは、custar さん。

    フォーラムのご利用ありがとうございます。オペレーターの山本です。
    ざっと検索してみました。以下のスレッドが参考になるかもしれません。

    I receive error when closing screen; Invalid operation. Dispatcher has been stopped.
    http://social.msdn.microsoft.com/Forums/en-US/lightswitch/thread/ec6d3b63-b5b4-411b-8c90-96946e0cc76b
    _____________________
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    • 回答としてマーク custar 2012年3月16日 5:08
    2012年3月15日 7:22
  • 山本 さん、情報有り難うございます。


    一つ目の Answer だと以下のようになります。




    partial void EditableBsGrid_Closing(ref bool cancel)
    {
    	var blocker = Blockers.AddNew();
    	var result = this.ShowMessageBox("close?", "close", MessageBoxOption.OkCancel);
    	if (result == System.Windows.MessageBoxResult.OK)
    	{
    		blocker.Details.DiscardChanges();
    	}
    	else
    	{
    		blocker.Details.DiscardChanges();
    		cancel = true;
    	}
    }

    余計な混乱を招きそうです。



    2つ目の Answer では以下のようになります。




    private bool isExplicitClose = false;
    
    partial void EditableBsGrid_Closing(ref bool cancel)
    {
    	if (!isExplicitClose && !this.DataWorkspace.ApplicationData.Details.HasChanges)
    	{
    		cancel = true;
    		Dispatchers.Current.BeginInvoke(ShowAreYouSureDialog);
    	}
    	else
    	{ }
    }
    
    private void ShowAreYouSureDialog()
    {
    	Debug.Assert(!this.DataWorkspace.ApplicationData.Details.HasChanges);
    	var result = this.ShowMessageBox("close?", "close", MessageBoxOption.OkCancel);
    	if (result == System.Windows.MessageBoxResult.OK)
    	{
    		isExplicitClose = true;
    		Close(false);
    		isExplicitClose = false;
    	}
    }

    これ以上何も出ません。
    これは未編集時のダイアログですが、
    何かしらの編集が行われていたら、「破棄しますか?」と聞いてくるダイアログが出ます。

    こっちがすっきり。

    • 編集済み custar 2012年3月16日 5:12
    2012年3月15日 9:30