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;)
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. –
+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. –