2014-10-16 10 views
8

सिकुड़ता है मैं इस तरह एक WPF उपयोगकर्ता नियंत्रण है ...उद्घाटन WPF उपयोगकर्ता नियंत्रण WinForm खिड़की माता पिता WinForm खिड़की

namespace WpfApplication1 
{ 
    public partial class MyControl : UserControl 
    { 
    ...... 
    } 
} 

मैं भी इस WPF उपयोगकर्ता नियंत्रण को रोकने के लिए एक जीत प्रपत्र है ...

namespace WindowsFormsApplication4 
{ 
public partial class Form1 : Form 
{ 

    public Form1() 
    { 

     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     ElementHost ctrlHost = new ElementHost(); 
     ctrlHost.Dock = DockStyle.Fill; 
     WpfApplication1.MyControl win = new WpfApplication1.MyControl(); 
     ctrlHost.Child = win; 
     this.Controls.Add(ctrlHost); 
    } 
} 
} 

मेरे पास एक और माता-पिता जीत फ़ॉर्म है जिसमें एक बटन है। बटन पर क्लिक करने से Form1 खोल जाएगा जिसमें ElementHost शामिल है।

namespace WindowsFormsApplication4 
{ 
    public partial class Parent : Form 
    { 
     public Parent() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Form1 form1 = new Form1(); 
      form1.Show(); 

     } 
    } 
} 

मेरा आवेदन डिफ़ॉल्ट रूप से जनक रूप से चलाता है ...

Application.Run(new Parent()); 

समस्या का सामना करना पड़ रहा हूँ अजीब है। जब मैं एप्लिकेशन चलाता हूं, तो मूल रूप खुलता है और बटन पर क्लिक करने पर डब्लूपीएफ नियंत्रण वाले बच्चे विंडो फॉर्म भी खुलते हैं। लेकिन समस्या यह है कि पैरेंट फॉर्म विंडो का आकार स्वचालित रूप से छोटा हो जाता है (विंडो विस्थापन, स्वयं को पुनर्स्थापित करता है और नियंत्रण और फ़ॉन्ट इसमें छोटा हो जाता है।) जैसे ही डब्ल्यूपीएफ नियंत्रण प्रपत्र पॉप अप हो जाता है। अगर मैं 'फॉर्म 1_ लोड' फ़ंक्शन की सामग्री पर टिप्पणी करता हूं तो पैरेंट विंडो कम नहीं होती है। सबसे बुरी स्थिति की जांच करने के लिए मैंने

ElementHost ctrlHost = new ElementHost(); 

लाइन को छोड़कर 'फॉर्म 1_ लोड' में सबकुछ टिप्पणी की। जैसा कि मैंने पहले उल्लेख किया था, इस पंक्ति की केवल उपस्थिति ही मूल रूप से कम हो जाती है। मैंने इस समस्या के लिए व्यापक रूप से इंटरनेट पर खोज करने की कोशिश की। मैं एक समाधान खोजने में सक्षम नहीं था। कृपया उत्तर के साथ मेरी मदद करें। मैं थक गया हूँ ....

+0

http://www.codeproject.com/Tips/130414/Host-Windows-Form-Controls-in-WPF कृपया इस लिंक पर गौर, मुझे लगता है कि अपने विंडो रूप प्रदान करें विशिष्ट चौड़ाई और ऊंचाई और फिर अपने बच्चे के उपयोगकर्ता नियंत्रण को लोड करने की कोशिश की। चूंकि बच्चे को जोड़ने की सामग्री आपके फॉर्म में जोड़ दी जाती है और यह पता चला है कि इसे और अधिक जगह की आवश्यकता है, यही कारण है कि इसकी सिकुड़ना क्यों है। –

+0

आपकी टिप्पणी अशोक के लिए धन्यवाद। मैंने पैरेंट विंडो के लिए चौड़ाई और ऊंचाई सेट करने की कोशिश की। लेकिन फिर भी वही समस्या मौजूद है ... – balaji

+0

इस पर कोई प्रगति? मेरी भी यही समस्या है। – user958578

उत्तर

7

मुझे लगता है कि इसके बाद के संस्करण टिप्पणी की मैं एक ही मुद्दा था और के बाद से यह संकल्प लिया है। मैं यहां किसी और के लिए अपने परिवर्तन लिख रहा हूं।

जैसा कि ऊपर देखा, व्यवहार होने के लिये एक WinForms आवेदन और बस समय (JIT) संकलक में विंडोज यूआई स्केलिंग का उपयोग कर WPF पुस्तकालयों से कुछ भी संसाधित करता है जब भी लगता है। मेरे मामले में, उस विधि को दर्ज करना जिसमें कोडबॉक्स है जो संदेशबॉक्स का WPF संस्करण खोलता है, ऐसा होगा। आमतौर पर विंडोज़ आपके लिए मूल स्केलिंग को संभालेगा, बिटमैप ऑफस्क्रीन पर प्रतिपादन करेगा और फिर स्क्रीन पर खींच रहा है लेकिन स्केल हो गया है। जब डब्ल्यूपीएफ लोड करता है तो ऐसा लगता है, जैसे कि यह विंडोज़ से कह रहा है, "अरे .. मुझे यह मिला .."। उसके बाद विंडोज़ आपके लिए WinForms स्केलिंग बंद कर देता है और आप 1x स्केल संस्करण और अक्सर कुछ उलझन में नियंत्रण के साथ समाप्त होता है। हालांकि डब्ल्यूपीएफ भाग अपना खुद का स्केलिंग कर रहा है और ठीक दिखता है।

तो जिस तरह से मैं सुलझाने यह विंडोज बताने के लिए है कि मैं WinForms स्केलिंग संभाल होता था के बारे में चला गया।

<application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> 
    </windowsSettings> 
</application> 

आप मालसूची फ़ाइल जोड़ सकते हैं: आप (dll प्रकट नजरअंदाज कर दिया है)

<asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
    <dpiAware>true</dpiAware> 
    </asmv3:windowsSettings> 
</asmv3:application> 

आपके आवेदन प्रकट करने के लिए इस जोड़ सकते हैं या निम्न अनुभाग uncomment अगर यह वहाँ में पहले से ही है कि सक्षम करने के लिए :

Right click on application project -> Add -> New item... -> Application Manifest File

तब में

...

Application Project -> Properties -> Application -> Resources

यकीन है कि "प्रकट" बनाओ app.manifest

पर सेट है अब आप उस फ़ाइल को खोजने के लिए और XML मूल <asmv1:assembly> तत्व में ऊपर जोड़ सकते हैं।

आप डिफ़ॉल्ट आवेदन प्रकट लिया और उस तत्व जोड़े यह शायद इस

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <applicationRequestMinimum> 
     <defaultAssemblyRequest permissionSetReference="Custom" /> 
     <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" /> 
     </applicationRequestMinimum> 
    </security> 
    </trustInfo> 
    <asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
     <dpiAware>true</dpiAware> 
    </asmv3:windowsSettings> 
    </asmv3:application> 
</asmv1:assembly> 

की तरह कुछ अब लग रहा है जब आप अपने WinForms आप इसे बहुत crisper है, क्योंकि यह उच्च डीपीआई पर गाया जा रहा है देखेंगे एप्लिकेशन शुरू गया है 96 डीपीआई के बजाय और फिर अंतरिक्ष को भरने के लिए बढ़ाया गया।

आप शायद देखेंगे कि आपकी कई छवियां घट गई हैं !! मेरे मामले में बटन, MenuStripItems और ToolStripItems वांछित के रूप में स्केल नहीं किया था।

मैं क्या पाया था सबसे नियंत्रण के लिए एक विधि है कि आप के रूप में नीचे ओवरराइड कर सकते हैं

protected override void ScaleControl(SizeF factor, BoundsSpecified specified) 
{ 
    base.ScaleControl(factor, specified); 
} 

यह कहा जाता है कि जब मुख्य रूप से आवेदन की शुरूआत और फिल्टर अपने नियंत्रण के माध्यम से। मेरा विंडोज 200% पर सेट है, मेरा मुख्य रूप स्केलिंग मोड डीपीआई पर सेट किया गया था और सभी रूपों को 100% स्केल (96 डीपीआई) पर डिज़ाइन किया गया था। मैंने स्केलिंग मोड के उत्तराधिकारी के लिए समस्या को ठीक करने के अपने पहले प्रयासों में सबकुछ बदल दिया और यह मेरे लिए काम किया गया, अगर आप फ़ॉन्ट का उपयोग कर रहे हैं या मुझे कोई संदेह नहीं है कि यह वही काम करेगा लेकिन मैंने कोशिश नहीं की है।

के रूप में मेरा 200% यूआई स्केलिंग जब इस विधि factor बस था बुलाया गया था था {2.0, 2.0} जो मैं तो MenuStrip की Items में से प्रत्येक पर ImageScalingSize बढ़ाने के लिए एक छोटा ImageButton में पुन: बनाने के लिए इस्तेमाल किया, और और ToolStrip चूंकि इन्हें स्केलकंट्रोल कॉल प्राप्त नहीं होता है। यदि आपने ऊपर एक्सएमएल कभी नहीं जोड़ा है तो इस विधि को अभी भी बुलाया गया है लेकिन कारक के लिए केवल {1.0, 1.0} होगा, जो सहायक नहीं है। नोट: यदि आप छवि सूची का उपयोग कर रहे हैं तो डिज़ाइनमोड या छविसूची में छवि को गतिशील रूप से सेट न करें और जब आप सहेज लेंगे तो कुछ भी सेट नहीं होगा

यह भी नहीं कि कारक वर्तमान से एक कारक है । आप क्या नोटिस करेंगे यदि आप विभिन्न डीपीआई मॉनीटर के बीच एप्लिकेशन को ले जाते हैं तो आपको 2.0, फिर 0.5, फिर 2.0, फिर 0.5, आदि

अब मेरा WinForms एप्लिकेशन सुपर कुरकुरा दिखता है और यह बिना जाने के WPF UI तत्वों को कॉल कर सकता है पागल! yyayyyyy

आशा इस मदद करता है किसी को

+0

बहुत बहुत धन्यवाद! मेरे मामले में, मुझे इसे बंद करना पड़ा ताकि वास्तव में विंडोज़ को सभी स्केलिंग को संभालने दें ... – Jerther

+0

धन्यवाद। यह सहायक था। –