2013-10-03 15 views
9

Mã sau đây minh họa một vấn đề mà tôi đang gặp khi đóng cửa sổ con sẽ thu nhỏ cửa sổ chính mà tôi không muốn xảy ra.Đóng cửa sổ con thu nhỏ phụ huynh

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 là cửa sổ ứng dụng chính.

SomeDialog là một cửa sổ bật lên trên một số sự kiện trong Window1 (nhấp đúp vào window1 trong ví dụ) cần phải là modeless.

CustomMessageBox là cửa sổ bật lên trên một số sự kiện trong "SomeDialog" (nhấp đúp vào SomeDialog trong ví dụ) cần phải là phương thức.

Nếu bạn chạy ứng dụng, sau đó bấm đúp vào nội dung của Window1 để hiển thị SomeDialog, sau đó bạn bấm đúp vào nội dung của SomeDialog để hiển thị CustomMessagebox.

Bây giờ bạn đóng CustomMessagebox. Khỏe.

Bây giờ nếu bạn đóng SomeDialog, Window1 sẽ thu nhỏ? Tại sao nó giảm thiểu và làm thế nào tôi có thể ngăn chặn nó?

Chỉnh sửa: Có vẻ như cách giải quyết khá đơn giản, sử dụng kỹ thuật được đề xuất bởi 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

Tôi gặp vấn đề tương tự với cửa sổ con bắt đầu quá trình mở thư mục (ví dụ: 'Process.Start (" C: \\ ")'). Câu trả lời được chấp nhận làm việc cho tôi. –

Trả lời

10

Tại sao nó giảm thiểu và làm thế nào tôi có thể dừng nó?

Không chắc chắn về "Tại sao" có thể bạn có thể báo cáo lỗi và xem nội dung họ trả lời bằng hộp thoại không có phương thức mà bạn không mong đợi điều này xảy ra.

Đối với một workaround, Hãy thử một cái gì đó như thế này:

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(); 
    } 
} 

^^ này nên ngăn chặn sự MainWindow (mẹ) từ giảm thiểu khi SomeDialog được đóng lại.

+0

Làm việc cho tôi, cảm ơn! Đây là một sửa đổi nhỏ để đơn giản hóa cuộc gọi trở lại (vì bạn biết ai là người gửi): 'x.Closing + = (sender, args) => {x.Owner = null; }; ' –

0

Trước tiên, khi mã của bạn viết tắt, tôi có thể xác nhận hành vi lạ này. Có hai điều tôi nhận thấy ở đây. Đầu tiên là các SomeDialog.Ownerkhông bộ, hoặc là nó kết thúc với một giá trị null với mã này:

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

Thêm mã này sửa chữa vấn đề rằng:

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

Thật không may, điều này doesn Không được giảm thiểu số MainWindow khi trẻ Window bị đóng. Sau đó, tôi thấy rằng tôi có thể ngăn chặn nó được giảm thiểu, nhưng chỉ khi gọi new SomeDialog().ShowDialog(); thay vì new SomeDialog().Show(); Tuy nhiên, điều này làm cho điều này Window vào một hộp thoại, mà không phải là những gì bạn đang sau khi tôi tin.

3

Giải pháp cho vấn đề thú vị này là kích hoạt MainWindow một lần và sau đó kích hoạt cửa sổ SomeDialog lần nữa.

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

Chúng tôi có vấn đề tương tự nhưng nguyên nhân khá đơn giản. Phương thức Close() của Window được gọi hai lần. Sau khi chúng tôi đã loại bỏ cuộc gọi thứ hai, tất cả đã trở lại bình thường.

1

Một câu trả lời rất muộn ... Tôi chỉ ngồi có cùng một vấn đề này và giải pháp của Viv giải quyết nó cho tôi là tốt. Đối với phần "Tại sao" của câu trả lời, tôi tin rằng điều đó xảy ra khi cửa sổ con của bạn sinh ra một cửa sổ con của riêng nó trong cuộc đời của nó. Đối với kinh nghiệm của tôi nó xảy ra bất cứ khi nào nhấn nút Save của tôi, đó là trong một dòng chảy đòi hỏi một cửa sổ con sẽ được mở ra. Tuy nhiên, nhấn nút Cancel (hoặc thoát) hoặc nút thoát mặc định của windows sẽ không gây ra vấn đề.

Các vấn đề liên quan