2010-05-27 38 views
6

Tôi có ứng dụng Windows Forms không biên giới.Biểu mẫu Windows và sự cố ShowDialog

Cửa sổ chính tạo các biểu mẫu khác (hộp thoại đơn giản nơi tôi có thể nhấp có hoặc không) với ShowDialog(). Mọi hộp thoại đã tạo không hiển thị trong thanh tác vụ, ứng dụng của tôi chỉ có một mục nhập thanh tác vụ tập trung ứng dụng của tôi (và nếu một hộp thoại đang mở mà tập trung vào). Nếu tôi sử dụng ALT + TAB để chuyển sang tất cả các cửa sổ đang mở, tôi cũng chỉ thấy một mục nhập.

Tuy nhiên, nếu hộp thoại được tạo trong khi ứng dụng của tôi không có tiêu điểm (ví dụ: người dùng bắt đầu tác vụ dài chạy, bắt đầu làm việc trên một thứ khác và trong khi ở chế độ nền, ứng dụng của tôi hiển thị hộp thoại " Công việc đã hoàn thành ... ") và tôi muốn quay trở lại ứng dụng của mình, mọi thứ trở nên lạ lẫm.

  • Nếu tôi nhấp vào thanh tác vụ để tập trung ứng dụng, cửa sổ chính sẽ được lấy nét (không phải hộp thoại).
  • Tôi không thể sử dụng cửa sổ chính (vì vẫn còn hộp thoại mở phương thức).
  • Windows 7 ALT + TAB xem trước hiển thị cửa sổ chính (trong hành vi bình thường cả hiển thị hộp thoại trước cửa sổ chính).
  • Cách duy nhất để ứng dụng của tôi có thể sử dụng lại là ALT + TAB để nhập và đóng hộp thoại phương thức.
  • Nếu tôi sử dụng ALT + TAB chỉ hộp thoại được đưa đến trước và cửa sổ chính vẫn ở chế độ nền.

Có cách nào để ngăn điều đó xảy ra không? Tôi biết phải làm gì, nhưng hầu hết khách hàng nghĩ rằng ứng dụng bị lỗi vì cửa sổ chính không phản hồi.

Cập nhật:

Giải pháp là để vượt qua các cửa sổ cấp cao nhất với phương pháp ShowDialog() (trong hầu hết các trường hợp và nếu được sử dụng trong một hình thức đó sẽ là "này").

Vì tôi không muốn refactor toàn bộ mã của tôi, và tất cả các hình thức của tôi kế thừa từ "MyCustomFormBase" đây là một giải pháp nhỏ hoạt động rất tốt.

Public Class MyCustomFormBase 

    Public Shared Property ApplicationMainForm() As Form 
     Get 
      Return _applicationMainform 
     End Get 
     Set(ByVal value As Form) 
      _applicationMainform = value 
     End Set 
    End Property 
    Private Shared _applicationMainform As Form 

    Public Shadows Function ShowDialog() As DialogResult 
     If MyCustomFormBase.ApplicationMainForm IsNot Nothing Then 
      Return MyBase.ShowDialog(MyCustomFormBase.ApplicationMainForm) 
     Else 
      Return MyBase.ShowDialog() 
     End If 
    End Function 

    Public Shadows Function ShowDialog(ByVal owner As IWin32Window) As DialogResult 
     Return MyBase.ShowDialog(owner) 
    End Function 

End Class 

Trong constructor của cửa sổ chính tôi sử dụng

MyCustomFormBase.ApplicationMainForm = Me 

một lần. Nó đã giúp tôi tái cấu trúc nửa ngày;)

Trả lời

4

Bạn đã thử chuyển một tham chiếu đến cửa sổ chính tới ShowDialog cuộc gọi?

// assuming this code is in the main form (so "this" refers to the main form) 
DialogForm dialog = new DialogForm(); 
DialogResult result = dialog.ShowDialog(this); 

Trích từ documentation of this overload:

Đây là phiên bản của phương pháp ShowDialog phép bạn chỉ định một hình thức cụ thể hoặc kiểm soát mà sẽ sở hữu hộp thoại hộp được hiển thị. Nếu bạn sử dụng phiên bản của phương pháp này không có thông số , hộp thoại được hiển thị sẽ được sở hữu tự động bởi cửa sổ đang hoạt động của ứng dụng của bạn.

+0

Tôi đã sử dụng phương pháp một nghìn lần và không bao giờ nhận thấy rằng có quá tải;) Dù sao đi nữa. cảm ơn nhiều. –

+0

+1, không có đối số, nó sẽ cố gắng tìm một. Cửa sổ máy tính để bàn, nếu cần. –

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