سؤال

لدي عدد 2 مراقبين و WinForm التطبيق التي تطلق WPF النافذة.أريد أن أحصل على الشاشة أن WinForm ، ثم تظهر نافذة WPF على نفس الشاشة.كيف يمكن أن أفعل هذا ؟

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

المحلول

WPF لا تشمل مفيد النظام.يقوم نظام ويندوز.أشكال.الشاشة الدرجة, ولكن لا يزال بإمكانك استخدام خصائصه لإنجاز المهمة الخاصة بك في الخاص بك WinForms التطبيق.

نفترض أن هذا يعني WinForms نافذة ، _wpfWindow هو تعريف متغير يشير إلى WPF نافذة في المثال أدناه (هذا من شأنه أن يكون في أي رمز معالج تعيين لفتح نافذة WPF مثل زر.انقر فوق معالج):

Screen screen = Screen.FromControl(this);
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual;
_wpfWindow.Top = screen.Bounds.Top;
_wpfWindow.Left = screen.Bounds.Left;
_wpfWindow.Show();

رمز أعلاه سوف مثيل WPF نافذة في أعلى الزاوية اليسرى من الشاشة يحتوي على WinForms النافذة.سأترك الرياضيات لك إذا كنت ترغب في وضعه في موقع آخر مثل منتصف الشاشة أو في "المتتالية" style أدناه إلى اليمين من WinForms النافذة.

طريقة أخرى أن يحصل على WPF نافذة في منتصف الشاشة سيكون ببساطة استخدام

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen

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

تحرير: وهنا رابط SDK الوثيقة حول استخدام InterOp على WPF نافذة تركزت على غير نافذة WPF.فإنه في الأساس ما كنت تصف من حيث معرفة الرياضيات ، ولكن بشكل صحيح يسمح لك تعيين WPF نافذة "مالك" الملكية باستخدام النافذة HWND.

نصائح أخرى

إليك أبسط طريقة (يستخدم WindowStartupLocation.CenterOwner).

MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;

dialogWindow.ShowDialog();

لا حاجة لإمكانية التشغيل المتداخل أو تحديد احداثيات نافذة:)

وهناك طريقة أخرى للقيام بذلك هي:

WindowInteropHelper helper = new WindowInteropHelper(this);

this.StartupLocation = System.Windows.WindowStartupLocation.Manual;
this.Left = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Left;
this.Top = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Top;

وهذا = النافذة WPF بك ...

ويجب أن تكون قادرا على استخدام System.Windows.Forms.Screen [1]، واستخدام الأسلوب FromControl للحصول على معلومات الشاشة للحصول على النموذج. ثم يمكنك استخدام هذا لتحديد المواقع نافذة WPF (أعلى اليسار) بناء على الشاشة التي تحاول تحديد موقع عليه.

[1] يمكنك أيضا استخدام Win32 وMonitorFromRect آخرون، إذا كنت لا لتحميل دلس WinForms عناصر. ومع ذلك، منذ كنت قد حصلت بالفعل على API WinForms عناصر، وأنت لن تدفع أي ضرب الذاكرة / الأداء.

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