كيفية تعيين WPF MessageBox.owner إلى نافذة سطح المكتب لأن SplashScreen يغلق MessageBox

StackOverflow https://stackoverflow.com/questions/576503

  •  05-09-2019
  •  | 
  •  

سؤال

أنا أستخدم شاشة البداية ميزة في WPF عن طريق تحديد صورة نقطية بناء العمل إلى Splashscreen. وراء شاشة البداية، تكون معلومات الترخيص تحقق، وإذا فشلت في عرض رسالة.

وفقا لهذا ردود الفعل, ، ومع ذلك لأن MessageBox.Owner هو شاشة البداية، وبمجرد فتح نافذة أخرى حتى إذا كانت رسالة MessageBox، يتم إغلاق نافذة شاشة البداية التي بإغلاق علبة الرسالة بعد ذلك، لذلك لا يرى المستخدم أبدا عبر صندوق الرسائل.

وبالتالي فإن الحل البديل سيكون لتعيين messageBox.owner إلى نافذة أخرى، ولكن هذا يعني أنه يجب علي إنشاء نافذة أخرى قد لا تكون هناك حاجة إليها.

هل سيكون من الممكن تعيين messageBox.owner إلى نافذة سطح المكتب؟ وكيف، لأن الوظيفة الأخرى الوحيدة التي تتبادر إلى الذهن هي getdesktopwindow () وظيفة API، ولكنها إرجاع مقبض النافذة و MessageBox.owner هي نافذة WPF.

هل كانت مفيدة؟

المحلول 3

لقد وجدت المشكلة. أنا أيضا استخدام شاشة البلاط في البداية والتي تسبب هذا: WPF Splashscreen يغلق messageBox

نصائح أخرى

نظرا لاستخدام نافذة سطح المكتب لأن الوالد لمراسل الوسائط الخاصة بك ليست فكرة جيدة، كما أشار nir في إجابته، فيما يلي ثلاثة حلول أخرى:

1) استخدام نافذة مخفية. قم بإنشاء نافذة صغيرة غير مشروطة للعمل كأستور لصندوق رسالتك أو مربع حوار مشروط آخر. يوصف هذا النهج هنا:

http://social.msdn.microsoft.com/forums/en-us/wpf/Thread/116BCD83-93BF-42F3-9BFE-DA9E7DE37546/DA9E7DE37546/DA9E7DE37546/

2) إنشاء نوافذ رسائل غير مشروطة. قم بتغيير وضع بدء التشغيل الخاص بك إلى إيقاف التشغيل واستخدام نافذة غير مشروطة لعرض رسالتك. يوصف هذا النهج في الإجابة على سؤال StackoverFlow هذا:

MessageBox مع تفاصيل الاستثناء يختفي على الفور إذا استخدمت شاشة البداية في WPF 4.0

3) استدعاء messageBox مرتين. على ما يبدو، تؤثر المشكلة فقط على مربع حوار مشروط أول موضح. لذلك يمكنك ببساطة استدعاء مربع الحوار المشروط الخاص بك مرتين، إذا لم تمانع في فلاش أول فتح وإغلاق.

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

شخصيا، أنا لا أحب أي من هذه الحلول. الخيار الآخر الوحيد هو تجنب وظيفة Splashscreen المدمجة وللفة الخاصة بك من الصفر. إليك رابط إذا كنت ترغب في التحقيق في هذا الطريق كذلك:

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

أخيرا، إذا كنت منزعجا من هذه المشكلة، فيمكنك التصويت ل Microsoft لإصلاح هذا الخطأ هنا:

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

توصلت إلى هذا الحل بنفسي، لذلك ربما هناك خطأ في ذلك، ولكن يبدو أنه يعمل تماما:

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

يمكنك نشر بعض الكود؟ حاولت فقط إضافة هذا إلى ملف app.xaml.cs في تطبيق WPF جديد:

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

... ويعمل كما هو متوقع ("تأكيد البداية" الإقامة الفائقة مفتوحة حتى أجبت، وإذا قمت بالنقر فوق "لا" التطبيق يغلق).

نافذة سطح المكتب ليست الوالد الصحيح أبدا، اقرأ هذا لمعرفة لماذا:

http://blogs.msdn.com/oldnewghing/archive/2004/02/24/79212.aspx.

الآن المشكلة الموضحة في هذا المنصب لا يحدث كثيرا لأن MS تعمل من حوله، في هذا المنشور، يمكنك أن ترى كيف:

http://blogs.msdn.com/oldnewghing/archive/2006/11/02/931674.aspx.

لقد ساعدني هذا كثيرا ..... أعطاني فكرة جديدة ولكن رمز المثال الذي رأيته هنا لديه بعض التعديلات المطلوبة

إليك مثال بسيط في WPF مع تعديل الآن يعمل

على زر انقر فوق

لصق هذا الرمز

إذا (System.windows.forms.messageBox.Show ("هل أنت متأكد"، "حذف"، System.windows.forms.messageBoxButtons.yesno، system.windows.forms.messagexicron.question) == system.windows.forms. dialogresult.yes) {this.close ()؛ } آخر {messialbox.show ("لماذا لا تحذف")؛ }

لا يرتبط هذا مباشرة بموقف OP، ولكن قد يكون مفيدا للآخرين الذين يواجهون مشاكل في صندوق الرسائل المخفية وراء النوافذ الأخرى في بعض المواقف الخاصة.

كما يذكرDRAPHER يذكر، حل واحد هو استخدام نافذة دمية مخفية. ولكن في بعض الأحيان حتى هذا لا يكفي. كان لدي موقف حيث لم يكن الحل ليس فقط استخدام نافذة دمية مخفية، ولكن لتحويل العقار الأعلى كلما كنت قد استخدمته مع MessageBox.

     _formKludge.TopMost = true;

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

     _formKludge.TopMost = false;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top