2009-02-04 12 views
12

के साथ एक विंडो दिखा रहा है मेरे पास 2 मॉनीटर और एक WinForm ऐप है जो एक WPF विंडो लॉन्च करता है। मैं स्क्रीन प्राप्त करना चाहता हूं जो WinForm चालू है, और उसी स्क्रीन पर WPF विंडो दिखाएं। मैं यह कैसे कर सकता हूँ?WPF, Winforms, और दोहरी मॉनीटर

उत्तर

14

डब्ल्यूपीएफ में आसान सिस्टम शामिल नहीं है। Windows.Forms। स्क्रीन कक्षा, लेकिन आप अभी भी अपने WinForms एप्लिकेशन में अपना कार्य पूरा करने के लिए अपनी संपत्तियों का उपयोग कर सकते हैं।

मान लें कि इस मतलब है WinForms खिड़की और _wpfWindow एक परिभाषित चर नीचे दिए गए उदाहरण में WPF विंडो को संदर्भित करती है (इस में होगा आप कुछ Button.Click की तरह, WPF विंडो खोलने के लिए सेट जो कुछ कोड हैंडलर हैंडलर):

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

ऊपर कोड अपने WinForms विंडो युक्त स्क्रीन के ऊपरी-बाएं कोने में WPF विंडो का दृष्टांत होगा। यदि आप इसे स्क्रीन के बीच या किसी "कैस्केडिंग" शैली में और अपने WinForms विंडो के दाईं ओर स्थित किसी अन्य स्थान पर रखना चाहते हैं तो मैं आपको गणित छोड़ दूंगा।

एक अन्य विधि है कि स्क्रीन के बीच में WPF विंडो हो जाता होगा बस

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen 

बहरहाल, यह काफी के रूप में लचीला नहीं है का उपयोग करने के क्योंकि यह माउस की स्थिति का उपयोग करता है यह पता लगाने की जो WPF विंडो को प्रदर्शित करने के लिए स्क्रीन (और स्पष्ट रूप से माउस आपके WinForms ऐप के रूप में एक अलग स्क्रीन पर हो सकता है यदि उपयोगकर्ता इसे जल्दी से चलाता है, या आप डिफ़ॉल्ट बटन का उपयोग करते हैं, या जो भी हो)।

संपादित करें: Here's a link to an SDK document इंटरऑप का उपयोग करने के बारे में गैर-WPF विंडो पर केंद्रित अपनी WPF विंडो प्राप्त करने के लिए। यह मूल रूप से गणित को समझने के संदर्भ में वर्णन करता था, लेकिन विंडो की एचडब्ल्यूएनडी का उपयोग करके आपको WPF विंडो की "स्वामी" संपत्ति सेट करने की अनुमति देता है।

1

आपको System.Windows.Forms.Screen [1] का उपयोग करने में सक्षम होना चाहिए, और फॉर्म के लिए स्क्रीन जानकारी प्राप्त करने के लिए FromControl विधि का उपयोग करना चाहिए। इसके बाद आप उस स्क्रीन पर आधारित WPF विंडो (शीर्ष, बाएं) को पोजिशन करने के लिए इसका उपयोग कर सकते हैं, जिसे आप इसे ढूंढने का प्रयास कर रहे हैं।

[1] यदि आप WinForms dlls लोड नहीं करना चाहते हैं तो आप Win32 MonitorFromRect et al का भी उपयोग कर सकते हैं। हालांकि, चूंकि आपको पहले से ही Winforms API मिल गया है, इसलिए आप किसी मेमोरी/perf हिट का भुगतान नहीं करेंगे।

6

यहां सबसे आसान तरीका है (WindowStartupLocation.CenterOwner का उपयोग करता है)।

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

dialogWindow.ShowDialog(); 

इंटरॉप या खिड़की coords :)

3

यह ऐसा करने का एक और तरीका है स्थापित करने के लिए कोई ज़रूरत नहीं है:

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 विंडो = ...

संबंधित मुद्दे