• 締切済み

WPFでのモーダル/モードレスダイアログの同時操作

WPFでメインウインドウからモードレスダイアログとモーダルダイアログを表示し、 それぞれのダイアログに対して操作をしたいと思っています。 1.メインウインドウのボタンをクリックしてモードレスダイアログを表示 2.メインウインドウのボタンをクリックしてモーダルダイアログを表示 上記2の処理を行うと、上記1で表示したモードレスダイアログが一切操作を受け付けなく なるのですが、対応方法はありますでしょうか? 仕様上、片方のダイアログは必ずモーダル表示にします。 ソースコードは以下のような感じです。 private Window2 window2; private void button1_Click(object sender, RoutedEventArgs e) { window2 = new Window2(); window2.Show(); } private void button2_Click(object sender, RoutedEventArgs e) { Window window3 = new Window3(); window3.ShowDialog(); } よろしくお願いいたします。

みんなの回答

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.1

メインウインドウからはshowdialog()で開き、開いたウインドウから、ボタンか初期化コードあたりでshow()でウインドウを呼び出す形にしないと無理じゃないでしょうか?  ダイアログはウインドウ付き関数みたいなもので、結果を入れるまで他の親ウインドウを動かさないと言う仕様と思えば解りやすいかと。 (名前をつけて保存の際のダイアログで、アプリのウインドウが操作出来ないのと同じ。)

onionslice
質問者

お礼

返事が遅くなりましたが、ありがとうございました。 最終的には、別プロセスとして起動し、プロセス間通信にて連携を取るように対応しました。

関連するQ&A

  • 【C#】サブフォームからメインフォームを操作

    サブフォームに設定したボタンをクリックしたらメインフォームのイベントを実行とかは可能でしょうか? メインフォーム→Main サブフォーム→Sub Mainに、ウェブブラウザ(webbrowser1)を用意して、 サブフォームのボタン(button1)をクリックしたら、 webbrowser1に、http://www.yahoo.co.jp が表示すると言うプログラムを作りたいです。 以下のプログラムではエラーが出てしまいました。 まず、Mainのフォームロード時にSubが開くように設定。 ※webbrowser1のModifiersをinternalに設定。 private void Main_Load(object sender, EventArgs e) { Sub subform = new Sub(); subform .Show(); } 次に、Subで Main mainform; private void button1_Click(object sender, EventArgs e) { mainform.webbrowser1.Navigete("http://www.yahoo.co.jp") } と書いて、実行時のエラーは無く実行できたのですが、 button1をクリックすると、エラーが出て止まってしまいます。 逆に、Subにウェブブラウザを置いて、Mainから操作するのは上記のプログラムで問題なく動きました。 どうすれば、Subからメインのイベントを操作できるのでしょうか? よろしくお願いします。

  • イベントハンドラ関数について

    現在VC++/CLR 2005 でプログラミングをしています。 基本的な事柄かもしれませんが、質問させてください  以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 その場合は private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { String^ str = textBox1->Text } のようにボタン2のイベントハンドラ関数をボタン1と同じように書けばいいのですが イベントハンドラ関数の処理が膨大になった場合を考えて省略する 書き方は無いのでしょうか?(以下の場合ですとエラーが起こってしまいます。) private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { button1_Click(); } 宜しくお願いします

  • C# Formの操作

    Form2 form2 ; // 子 Form Form3 form3 ; // 子 Form private void button1_Click(object sender, System.EventArgs e) { form2 = new Form2() ; this.AddOwnedForm(form2) ; // 親 Form が form2 を所有する form2.Show() ; } private void button2_Click(object sender, System.EventArgs e) { form3 = new Form3() ; this.AddOwnedForm(form3) ; // 親 Form が form3 を所有する form3.Show() ; } 上記のようにボタン一つに対して1つのFormに対する処理をするのではなく,ボタン1つに対して 複数のFormを処理する.つまり 例えば,Form1,2,3とあったとして,Form1のボタンを押してFrom2を開き,そこで何らかの処理を したものをForm1に反映する.または,From3のボタンを押してForm2を開きそこで何らかの処理を 行いForm3に反映する. この場合,Form1とForm3のどちらのFormのボタンが押されたか判断しないといけないと思うのですが,ここの処理がうまくいきません. どちらかのFormのボタンを押してForm2を表示し,どちらかのFormに反映させる所までは出来たのですが,両方の判断材料を入れて,どちらのFormのボタンを押されたか判断する際に,押されなかった方が「null」となりエラーになります. 下記にこの判断部分を掲載いたします.どなたかご教授よろしくお願いいたします. Form1 public int but = 0; public int butt1; public string DB; public string HDB; public Form2 f2 = null; private void mybutton1_Click(object sender, EventArgs e) { butt1 = 1; ・ ・ ・ public int Ye=0; private void button43_Click(object sender, EventArgs e) { butt1 = 0; From2 public partial class Form2 : Form { Form1 f1; Form3 f3; public Form2(Form1 f) { f1 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } public Form2(Form3 f) { f3 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { #region int Pin1 = f1.butt1; int Pin3 = f3.butt3; Form3 Form1と基本的には同じです.

  • Sleep(0)について

    VS2010C++でWindowsフォームアプリケーションをつくろうとしています。 ループさせたいイベント(button1)中に、button2のイベントを行いたいのでSleep(0)を使って以下のようにしました。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { while(1){ Sleep(0); // ループさせたいイベント ・・・・・・・・・・・・・・・・・・・・ } } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {    ・・・・・・・・・・・・・・・・・・・・ } アプリケーション起動後button1をクリックすると、Sleep(0)が無いときと同じようにボタンを受け付けなくなります。 Sleep(0)の使い方が間違っているのでしょうか。

  • C# フォーム追加後、旧フォームを閉じたい

    前略 ・C#で教えてください。 ・Form1 からshowDiag()メソッドでForm2をつくります。Form2が表示されたら非アクティブとなったForm1を閉じたいのですが どのようにしたらよいのかおしえてください。  下記は、Close() メソッドで Form2側から閉じようとしたプログラムですがFrom1を閉じることができません。 よろしくお願いします。 //----------------------------------------------- namespace formClose { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.ShowDialog(); } }   public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { Form1 form1 = new Form1(); form1.Close(); //Form1が閉じない!! } private void button1_Click(object sender, EventArgs e) { this.Close(); //Form2を閉じる }    } } 以上

  • モードレスダイアログ

    お世話になっております。 VC2005を使用しております。 メインウィンドウの他にモードレスダイアログを常時表示させたいと 考えております。 ダイアログのプロパティのTopmostをTrueにすると常時手前に表示されるのですが、メインウィンドウを最小化したり、他のプログラムを起動した時も常に前面に表示されてしまいます。 メインウィンドウと同じように動作するにはどうすればよいのでしょうか?教えてください。 よろしくお願いします。

  • C#プログラムにて

    C#プログラムにて お世話になります。 C#初心者です。 プログラムコードを書き始めで、早速行き 詰っています。 ステップでコードの動きを確認したところ、 program.csのMainから下記のForm1.csに 移りForm1のデザイナが表示されるのですが、 button3を押してもForm3が表れません。 また、ステップの黄色いカーソルと言いますか ステップの位置情報も消えています。 何がどう悪いのか分からなく困っています。 どなたかご親切な方、ご教授頂きたく 宜しくお願い致します。     記 using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { DialogResult ans; ans = MessageBox.Show("最新のコード表を照会しますか?", "Microsoft Visual Studio", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ans == DialogResult.OK) Application.Exit(); } private void button12_Click(object sender, EventArgs e) { Form4 cForm4 = new Form4(); cForm4.ShowDialog(); } } }

  • C#でオブジェクトの有無を取得する

    オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。 この書き方の何がまずいのでしょうか? namespace オブジェクト検索 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Control c = Controls["form2"]; if (c != null) { ((TextBox)c).Text += "*"; } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); Application.DoEvents(); } } } ボタン2を押した時に新しいフォームが立ち上がり、そのフォームがあるときは*が出るようにしたいです。

  • C# WEB表示について

    フォーム上にwebBrowser1があって下の通りに読み込み完了しましたと出ますが、 webBrowser1に表示されません。どうしたらいいですか? webBrowser1のプロバティでイベントを利用するのではなくコードで作りたいので、どなたか教えて頂けませんか? ボタン1はヤフーで、ボタン2とかも製作したいので。 ソース private void button1_Click(object sender, EventArgs e) { WebBrowser webBrowserForPrinting = new WebBrowser(); webBrowserForPrinting.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webview); webBrowserForPrinting.Url = new Uri("http://www.yahoo.co.jp/"); } private void webview(object sender,WebBrowserDocumentCompletedEventArgs e) { MessageBox.Show("Webページの読み込みが完了しました!!"); }

  • モードレスダイアログについて

    いつもお世話になっています。 WIN98 VC++6.0 MFC モードレスダイアログにおいて、 子ダイアログが表示されていても親ダイアログの操作が出来ますが、親ダイアログを子ダイアログの前に持ってくるにはどうすれば良いのでしょうか?

専門家に質問してみよう