2012-05-31 13 views
8

Nếu tôi tạo một lớp bắt nguồn từ System.Windows.Window và hiển thị nó với ShowDialog nó xuất hiện phía trên cửa sổ chính như mong đợi và cửa sổ chính bị vô hiệu hóa. Tuy nhiên, có thể đặt cả hai cửa sổ phía sau các ứng dụng khác, và sau đó chỉ cần mang lại cửa sổ chính trở lại. Điều này chỉ để lại một cửa sổ có vẻ như đã bị rơi và có thể gây nhầm lẫn.Làm thế nào tôi có thể ngăn chặn một cửa sổ hộp thoại bị ẩn

Có thể đảm bảo rằng cửa sổ hộp thoại luôn được hiển thị nếu cửa sổ chính được hiển thị? Hộp thoại MessageBox.Show không có vấn đề như vậy

Cập nhật:

Một hộp thoại kiểm tra được định nghĩa là

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

và gọi sử dụng

MyDialog d = new MyDialog(); 
    d.ShowDialog(); 
+0

Bạn có sử dụng phương pháp Mẫu :: ShowDialog (IWin32Window)? Hộp thoại với cửa sổ chủ sở hữu sẽ hoạt động như bạn mong đợi. –

+0

Tôi không sử dụng Biểu mẫu, đó là System.Windows.Window và ShowDialog không lấy bất kỳ thông số –

Trả lời

7

bạn phải đặt thuộc tính Chủ sở hữu.

MyDialog d = new MyDialog(); 
d.Owner = Application.Current.MainWindow;//or your owning window 
d.ShowDialog(); 
+0

Tôi đang sử dụng 'PopupWindowAction' trong Ứng dụng WPF của mình. Đặt _owner_ thành _current window_ là khóa để nhận hành vi được mô tả mà chúng ta biết từ _Windows MessageBox_. (Cảm ơn, tôi đã tìm kiếm một giờ ...!) – RamNow

1

Để đảm bảo rằng các cửa sổ hộp thoại luôn hiển thị nếu cửa sổ chính được hiển thị, thêm trình xử lý vào chế độ hiển thị biểu mẫu chính đã thay đổi sự kiện để đặt TopMost t rue hay sai mẫu con theo tầm nhìn chính

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

Cập nhật

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

Việc chữa bệnh cuối cùng tôi có thể nghĩ là sử dụng một bộ đếm thời gian với user32 dll getforegroundwindow để kiểm tra xem hình thức chính là nhìn thấy được.

+0

Tôi đang sử dụng System.Windows.Window không phải là Biểu mẫu và không có thuộc tính Sự kiện có thể nhìn thấy được. Xin lỗi vì không làm cho rõ ràng –

+0

Xin lỗi tôi không thể tìm thấy System.Windows.Window trong dot net 3.5, bất kỳ cách nào nếu bạn có thể tìm thấy tài sản Window.Visible để cố gắng ghi đè nó để thay vì 'MainFrmVisibleChanged' của tôi sử dụng các thiết lập của tài sản có thể nhìn thấy kiểm tra cập nhật lên đó –

+1

Chi tiết có tại http://msdn.microsoft.com/en-us/library/system.windows.window.aspx Cảm ơn bạn đã đề xuất, nhưng cài đặt chủ sở hữu giải quyết vấn đề cho trường hợp của tôi. –

1

Mã này nên làm việc như bạn muốn

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; 
+0

Nó có, cảm ơn, nhưng thiết lập chủ sở hữu là một chút đơn giản hơn –