9

System.Windows.Window から派生したクラスを作成し、それを ShowDialog で表示すると、予想どおりメイン ウィンドウの上に表示され、メイン ウィンドウが無効になります。ただし、両方のウィンドウを他のアプリケーションの背後に置いて、メイン ウィンドウだけを元に戻すことは可能です。これにより、クラッシュしたように見える単一のウィンドウが残るだけで、混乱する可能性があります。

メインウィンドウが表示されている場合、ダイアログウィンドウが常に表示されるようにすることは可能ですか? MessageBox.Show ダイアログにはそのような問題はありません

アップデート:

テスト ダイアログは次のように定義されます。

public partial class MyDialog : Window
{
    public MyDialog()
    {
        InitializeComponent();
    }
}

を使用して呼び出されます

    MyDialog d = new MyDialog();
    d.ShowDialog();
4

3 に答える 3

8

Owner プロパティを設定する必要があります。

MyDialog d = new MyDialog();
d.Owner = Application.Current.MainWindow;//or your owning window
d.ShowDialog();
于 2012-05-31T08:27:06.757 に答える
1

メインウィンドウが表示されている場合にダイアログウィンドウが常に表示されるようにするには、メインフォームの可視性変更イベントにハンドラーを追加してTopMost、メインの可視性に応じて子フォームにtrueまたはfalseを設定します

ChildForm frmDLg = null;
public MainForm()
{
    this.VisibleChanged += MainFrmVisibleChanged;
}

private void LoadDialogForm()
{
    try {
        if (frmDLg == null || frmDLg.IsDisposed) {
            frmDLg = new ChildForm();
        }
        frmDLg.ShowDialog();
    } catch (Exception ex) {
        //Handle exception
    }
}

private void MainFrmVisibleChanged(object sender, System.EventArgs e)
{
    if (frmDLg != null && !frmDLg.IsDisposed) {
        frmDLg.TopMost = this.Visible;
    }
}

アップデート

public override bool Visible
        {
            get
            {
                return base.Text;
            }
            set
            {
                base.Text = value;
                // Insert my code
                if (frmDLg != null && !frmDLg.IsDisposed)
                {
                    frmDLg.TopMost = this.Visible;
                }
            }
        }

私が考えることができる最後の治療法は、user32 dll getforegroundwindowでタイマーを使用して、メインフォームが表示されているかどうかを確認することです。

于 2012-05-31T08:10:45.600 に答える
1

このコードはあなたが望むように動作するはずです

public MainWindow()
    {
        InitializeComponent();

        this.Activated += new EventHandler(MainWindow_Activated);
    }

    void MainWindow_Activated(object sender, EventArgs e)
    {
        if (m == null)
            return;

        m.Activate();
    }


    private void button1_Click(object sender, RoutedEventArgs e)
    {
        m = new MyDialog();
        m.ShowDialog();
    }
    MyDialog m;
于 2012-05-31T08:40:18.963 に答える