2009-02-23 38 views
9

Tôi đang sử dụng tính năng SplashScreen trong WPF bằng cách đặt bitmap Build Action thành Splashscreen. Phía sau màn hình giật gân, thông tin cấp phép đang được kiểm tra và nếu nó không thành công, tôi sẽ hiển thị MessageBox.cách đặt wpf MessageBox.Owner thành cửa sổ máy tính để bàn vì SplashScreen đóng MessageBox

Theo điều này Feedback, đó là vì MessageBox.Owner là màn hình giật gân và ngay khi cửa sổ khác mở ngay cả khi đó là một MessageBox, cửa sổ màn hình bị đóng, sau đó đóng hộp MessageBox, người dùng không bao giờ thấy MessageBox.

Vì vậy, giải pháp thay thế sẽ là đặt MessageBox.Owner thành một cửa sổ khác, nhưng điều đó có nghĩa là tôi phải khởi tạo một cửa sổ khác thậm chí có thể không cần thiết.

Có thể đặt MessageBox.Owner thành cửa sổ máy tính để bàn không? Và làm thế nào, bởi vì chức năng khác duy nhất mà nói đến cái tâm là chức năng api GetDesktopWindow() api, nhưng điều đó trả về một cửa sổ xử lý và MessageBox.Owner là một cửa sổ WPF.

Trả lời

4

Tôi đã tìm thấy sự cố. Tôi cũng sử dụng màn hình splash xây dựng, trong đó nguyên nhân này: WPF SplashScreen closes MessageBox

+0

Câu hỏi bây giờ là bạn sẽ đặt chủ sở hữu của MessageBox thành cửa sổ deskop như thế nào? – adriaanp

1

Bạn có thể đăng một số mã không? Tôi chỉ cố gắng này thêm vào các tập tin App.xaml.cs trong một ứng dụng WPF mới:

protected override void OnStartup(StartupEventArgs e) 
{ 
    if (MessageBox.Show("Start app?", "Confirm Start", 
     MessageBoxButton.YesNo) == MessageBoxResult.No) 
    { 
     this.Shutdown(); 
     return; 
    } 

    this.StartupUri = new Uri("Window1.xaml", UriKind.Relative); 
    base.OnStartup(e); 
} 

... và nó hoạt động như mong đợi ("Xác nhận Start" ở lại nhắc mở cho đến khi tôi đã phản hồi và nếu tôi nhấp vào "Không", ứng dụng sẽ tắt).

+0

Matt, tôi cũng đã thử nghiệm nó như bạn đã làm và nhận ra nó không làm việc, bởi vì tôi đã sử dụng một màn hình, nó đóng MessageBox, mà không có màn hình splash nó không đóng – adriaanp

+0

Vì vậy, tôi đoán bây giờ bạn cần quyết định có nên đóng câu hỏi là "Không còn liên quan" hay (như @adriaanp gợi ý trong bình luận của mình) làm lại nó như một câu hỏi khác. –

0

này đã giúp tôi rất nhiều ..... Với tôi ý tưởng mới nhưng mã ví dụ mà tôi đã nhìn thấy ở đây có một số sửa đổi cần thiết

đây là một ví dụ đơn giản trong WPF với sửa đổi bây giờ nó đang làm việc

vào nút bấm

dán này mã

nếu (System.Windows.Forms.MessageBox.Show ("là u chắc chắn", "xóa", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == Hệ thống .Windows.Forms.DialogResult.Yes) { this.Close(); } else { MessageBox.Hiển thị ("tại sao không xóa"); }

9

Kể từ khi sử dụng cửa sổ máy tính để bàn như phụ huynh cho các hộp thoại modal của bạn không phải là một ý tưởng tốt, như @Nir chỉ ra trong câu trả lời của mình, đây là ba cách giải quyết khác:

1) Sử dụng một cửa sổ ẩn. Tạo một cửa sổ nhỏ, phi phương thức để hoạt động với tư cách là phụ huynh cho MessageBox của bạn hoặc hộp thoại phương thức khác. Cách tiếp cận này được mô tả ở đây:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) Tạo thông điệp cửa sổ phi phương thức. Thay đổi chế độ khởi động của bạn thành tắt hoàn toàn và sử dụng cửa sổ không theo kiểu để hiển thị thông báo của bạn. Cách tiếp cận này được mô tả trong các câu trả lời cho câu hỏi StackOverflow này:

MessageBox with exception details immediately disappears if use splash screen in WPF 4.0

3) Gọi MessageBox hai lần. Rõ ràng, vấn đề chỉ ảnh hưởng đến hộp thoại phương thức đầu tiên được hiển thị. Vì vậy, bạn có thể chỉ cần gọi hộp thoại phương thức của bạn hai lần, nếu bạn không nhớ đèn flash của một mở đầu tiên và đóng cửa.

https://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

Cá nhân, tôi không thích bất kỳ cách giải quyết nào sau đây. Tùy chọn duy nhất khác là tránh chức năng SplashScreen tích hợp và cuộn của riêng bạn từ đầu. Dưới đây là một liên kết nếu bạn muốn điều tra rằng đường xa hơn:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

Cuối cùng, nếu bạn là khó chịu bởi vấn đề này như tôi, bạn có thể bỏ phiếu cho Microsoft để sửa lỗi này ở đây:

http://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

8

tôi đã đưa ra giải pháp này bản thân mình, như vậy có lẽ có điều gì đó sai với nó, nhưng có vẻ như để làm việc một cách hoàn hảo:

Window temp = new Window() { Visibility=Visibility.Hidden }; 
temp.Show(); 
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop); 
App.Current.Shutdown(1); 
+2

Giải pháp đơn giản và dễ dàng. Tuy nhiên, 'Visibility = Visibility.Hidden' không thực sự cần thiết, vì bạn sẽ hiển thị cửa sổ. Thay vào đó, để tránh hiển thị giật gân của cửa sổ nền, tôi đã sử dụng: 'Cửa sổ mới {WindowState = WindowState.Minimized, ShowInTaskbar = false}' – splintor

+0

'Cửa sổ mới {AllowTransparency = true, ShowInTaskbar = false, WindowStyle = WindowStyle.None , Background = Brushes.Transparent} 'có thể làm cho cửa sổ ẩn hoàn toàn trong khi thiết lập trạng thái hiển thị hoặc cửa sổ sẽ làm cho cửa sổ được hiển thị trong vài millisec khi' Show() 'được gọi. – kiran

0

Điều này không liên quan trực tiếp đến tình hình của OP, nhưng có thể hữu ích cho những người đang gặp sự cố với MessageBox bị ẩn sau các cửa sổ khác trong một số trường hợp đặc biệt.

Như @dthrasher đề cập, một giải pháp là sử dụng cửa sổ giả ẩn. Nhưng đôi khi thậm chí là không đủ. Tôi đã có một tình huống mà các giải pháp là không chỉ sử dụng một cửa sổ giả ẩn, nhưng để bật tài sản TopMost của nó bất cứ khi nào tôi sử dụng nó với MessageBox.

 _formKludge.TopMost = true; 

    MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program", 
        MessageBoxButtons.OK, MessageBoxIcon.Error); 

    _formKludge.TopMost = false; 
Các vấn đề liên quan