2010-10-08 10 views
7

Ứng dụng WPF trên máy tính để bàn của tôi (4.0) hoạt động với DB và để thiết lập kết nối với SQL Server khi khởi động ứng dụng. Tất nhiên, hoạt động này mất một thời gian và người dùng phải chờ một vài giây (3-5) trong khi .Net Framework khởi động và kết nối với SQL Server.MessageBox với các chi tiết ngoại lệ ngay lập tức biến mất nếu sử dụng màn hình splash trong WPF 4.0

Khi thích hợp trong các trường hợp như vậy, tôi quyết định sử dụng màn hình giật gân. Tôi thêm một số hình ảnh cho giải pháp, thiết lập hành động xây dựng như «Splash màn hình», biên dịch ứng dụng của tôi, nó hoạt động! Nếu cố gắng kết nối với SQL Server không thành công (ví dụ: máy chủ không khả dụng) ứng dụng của tôi sẽ ném ngoại lệ và tôi hiển thị cho người dùng MessageBox với các chi tiết cảnh báo và ngoại lệ, người dùng nhấn OK và tắt ứng dụng (Application.Current.Shutdown()).

Trước khi tôi thêm màn hình splash, tất cả logic này được sử dụng để hoạt động hoàn hảo, nhưng bây giờ, với màn hình giật gân được thêm vào, nếu tôi chạy ứng dụng trong khi SQL Server không khả dụng, ứng dụng sẽ ném ngoại lệ (như tôi đã yêu cầu trong mã của tôi), nhưng MessageBox với thông báo xuất hiện trong 1-2 giây và biến mất mà không có bất kỳ tương tác người dùng nào, người dùng thậm chí không thể đọc những gì được viết trên đó.

Tôi phát hiện ra rằng nếu tôi cố gắng hiển thị 2 MessagBox, vì vậy trang đầu tiên sẽ xuất hiện và biến mất ngay lập tức, nhưng cái thứ hai sẽ ở lại cho đến khi người dùng nhấn OK.

Câu hỏi của tôi là: Cách giải quyết vấn đề này? Tôi muốn sử dụng màn hình splash và hiển thị một MessageBox nếu một ngoại lệ đã được ném và cho phép người dùng quyết định thời điểm đóng nó (người dùng nhấp vào nút OK).

Dưới đây là một biểu đồ dòng chảy mô tả logic của ứng dụng của tôi:

Không có ngoại lệ (kịch bản tốt): Chạy ứng dụng → Splash màn hình → if (isConnectedToSQL = true) → Hiển thị cửa sổ chính ...

Với ngoại lệ (kịch bản xấu): Chạy ứng dụng → Màn hình Splash → nếu (isConnectedToSQL = false) → Ném ngoại lệ → Hiển thị MessageBox với chi tiết ngoại lệ → Người dùng nhấp vào OK → Đóng ứng dụng.

Cảm ơn.

Trả lời

6

Lý do nằm ở cách SplashScreen sử dụng BeginInvoke để đóng chính nó. Tôi không thể ghim chính xác vị trí của MessageBox đang đóng *, nhưng tôi đã thấy một sửa lỗi đơn giản:

Không sử dụng MessageBox.

Tạo cửa sổ lỗi, hãy gọi nó là "ErrorWindow.xaml". Sử dụng cửa sổ đó để hiển thị thông báo lỗi cho người dùng và trả lời nút OK.

theo this guideline để khai báo thủ tục chính của riêng bạn và thay đổi nó như vậy:

chỉnh sửa để hiển thị như thế nào bạn có thể vượt qua thông tin để các ErrorWindow.

public static void Main() 
{ 
    SplashScreen splashScreen = new SplashScreen("whatever.jpg"); 
    splashScreen.Show(true); 
    string errorMessage; 
    bool dataLoaded = LoadDataFromDatabase(out errorMessage); 
    WpfApplication1.App app = new WpfApplication1.App(); 
    Window windowToRun = dataLoaded ? (Window)new MainWindow() : (Window)new ErrorWindow { ErrorMessage = errorMessage }; 
    app.Run(windowToRun); 
} 
  • tôi đoán là SplashScreen.Show và Application.Run hai thông điệp riêng biệt bơm. Việc đầu tiên được chấm dứt với một cuộc gọi đến PostQuitMessage. Điều đó giải thích tại sao MessageBox đóng lại.
-1

Với mô tả vấn đề ở https://connect.microsoft.com/VisualStudio/feedback/details/381980/wpf-splashscreen-closes-messagebox#tabs một cách để giải quyết này là DllImport SetActiveWindow và gọi nó như SetActiveWindow (IntPtr.Zero) ngay trước khi gọi MessageBox.Show. Sau đó, hộp tin nhắn sẽ không nhận được màn hình giật gân như cha mẹ của nó và sẽ không chết khi màn hình giật gân đóng lại chính nó.