2013-10-03 24 views
9

以下代碼演示了我在關閉子窗口時將父窗口最小化的問題,我不希望發生這種情況。關閉子窗口使父項最小化

class SomeDialog : Window 
    { 
     protected override void OnMouseDoubleClick(MouseButtonEventArgs e) 
     { 
      base.OnMouseDoubleClick(e); 
      new CustomMessageBox().ShowDialog(); 
     } 
    } 

    class CustomMessageBox : Window 
    { 
     public CustomMessageBox() 
     { 
      Owner = Application.Current.MainWindow; 
     } 
    } 

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

     protected override void OnMouseDoubleClick(MouseButtonEventArgs e) 
     { 
      base.OnMouseDoubleClick(e); 
      new SomeDialog() { Owner = this }.Show(); 
     } 
    } 

Window1是主應用程序窗口。

SomeDialog是一個窗口,彈出Window1中的某個事件(在示例中雙擊window1),該窗口需要是無模式

CustomMessageBox是一個窗口,可以彈出某個事件在「SomeDialog」中的某個事件(雙擊該示例中的SomeDialog),該窗口需要爲模態

如果您運行該應用程序,然後雙擊Window1的內容以調出SomeDialog,然後雙擊SomeDialog的內容以調出CustomMessagebox。

現在關閉CustomMessagebox。精細。

現在,如果關閉SomeDialog,Window1會最小化?爲什麼它最小化,我該如何阻止它?

編輯:看起來解決方法很簡單,使用Viv提出的技術。

class SomeDialog : Window 
    { 
     protected override void OnMouseDoubleClick(MouseButtonEventArgs e) 
     { 
      base.OnMouseDoubleClick(e); 
      new CustomMessageBox().ShowDialog(); 
     } 

     protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
     { 
      base.OnClosing(e); 
      Owner = null; 
     } 
    } 
+0

我與子窗口啓動一個進程打開一個目錄(例如'Process.Start(「C:\\」)')相同的問題。接受的答案爲我工作。 –

回答

10

爲什麼它最小化,我該如何阻止它?

不確定關於「爲什麼」,也許你可以報告它作爲一個錯誤,並看到他們的答覆與非模態對話,你不希望這發生。

至於解決方法,嘗試是這樣的:

public partial class MainWindow : Window { 
    ... 

    protected override void OnMouseDoubleClick(MouseButtonEventArgs e) { 
    base.OnMouseDoubleClick(e); 
    var x = new SomeDialog { Owner = this };   
    x.Closing += (sender, args) => { 
     var window = sender as Window; 
     if (window != null) 
     window.Owner = null; 
    }; 
    x.Show(); 
    } 
} 

^^這可以防止MainWindow(父)從當SomeDialog關閉最小化。

+0

爲我工作,謝謝!這裏是一個簡化回調的小修改(因爲你知道發件人是誰): 'x.Closing + =(sender,args)=> {x.Owner = null; };' –

0

首先,作爲您的代碼,我可以證實這種奇怪的行爲。我在這裏注意到了兩件事。第一個是,SomeDialog.Owner集,或者說,它與null值與此代碼結束:

new SomeDialog() { Owner = this }.Show(); 

添加該代碼修復這個問題:

public SomeDialog() 
{ 
    Owner = Application.Current.MainWindow; 
} 

不幸的是,這並未當兒童Window關閉時,不會阻止MainWindow的最小化。然後我發現我可以阻止它最小化,但只有在撥打new SomeDialog().ShowDialog();而不是new SomeDialog().Show();然而,這使得這個Window成爲一個對話框,這不是我相信之後。

3

我對這個有趣的問題的解決方法是激活MainWindow一次,之後再次激活SomeDialog窗口。

class SomeDialog : Window 
{ 
    protected override void OnMouseDoubleClick(MouseButtonEventArgs e) 
    { 
     base.OnMouseDoubleClick(e); 
     new CustomMessageBox().ShowDialog(); 
     Owner.Activate(); 
     Activate(); 
    } 
} 
0

我們有類似的問題,但原因很簡單。 Window的Close()方法被調用兩次。在我們刪除了第二個電話後,一切恢復正常。

1

一個很晚的答案......我只是坐在這個相同的問題上,Viv的解決方法爲我解決了這個問題。至於答案的「爲什麼」部分,我相信當你的子窗口在其生命週期中產生一個子窗口時,它會發生。 根據我的經驗,每當按下我的保存按鈕,這是在需要打開子窗口的流程中發生。但按下取消(或退出)或Windows默認退出按鈕不會引發問題。

相關問題