2008-10-13 16 views
11

में सिल्वरलाइट होस्ट किया गया है, मैं Winforms ब्राउज़र के माध्यम से Winforms में चांदी के नियंत्रण को होस्ट करना चाहता हूं, लेकिन इसके लिए काम करने के लिए मुझे चांदी के प्रकाश से बात करने के लिए कुछ और तरीकों की आवश्यकता है। क्या किसी भी तरह से माइक्रोसॉफ्ट के रूप में जावास्क्रिप्ट का उपयोग करके दोनों एक-दूसरे के साथ बातचीत कर सकते हैं? यानी, क्या फॉर्म ब्राउज़र के जावास्क्रिप्ट से बात करता है, और क्या वह चांदी की रोशनी नियंत्रण से बात करता है? क्या कोई बेहतर तरीका है? या यहां तक ​​कि एक रास्ता भी? (कोड को Silverlight और wpf के रूप में संकलित करने के अलावा)विनफॉर्म

उत्तर

15

मुझे लगता है कि विंडोज फॉर्म वेबब्रोसर नियंत्रण का उपयोग करना आपकी सबसे अच्छी शर्त है। ऐसा करने के लिए, आपको अपने Silverlight ऐप को किसी वेबपृष्ठ पर चाहिए, फिर आप अपने वेब ब्राउजर को पेज के यूआरआई पर इंगित करें।

आईई की तरह अभिनय से अपने WebBrowser नियंत्रण रखने के लिए, मैं निम्नलिखित करने का सुझाव देते हैं: से Silverlight के भीतर बहुत आसान करने के लिए है अपने फार्म पर

webBrowser.AllowNavigation = false; 
webBrowser.AllowWebBrowserDrop = false; 
webBrowser.IsWebBrowserContextMenuEnabled = false; 
webBrowser.WebBrowserShortcutsEnabled = false; 

कॉलिंग तरीकों। शुरू करने के लिए, आपको उस वर्ग की आवश्यकता है जिसमें सिल्वरलाइट से आप जिस तरीके को कॉल करना चाहते हैं। आप अपने फॉर्म या अन्य ऑब्जेक्ट का उपयोग कर सकते हैं, लेकिन आपको कक्षा को [कॉमविज़िबल (सत्य)] विशेषता के साथ चिह्नित करने की आवश्यकता है। फिर आप अपनी ऑब्जेक्ट को WebBrowser.ObjectForScripting प्रॉपर्टी पर असाइन करते हैं। यह आपके ऑब्जेक्ट को वेबपृष्ठ पर "window.external" के रूप में उजागर करता है।

[ComVisible(true)] 
public partial class Form1 : Form 
{ 
    ...... 
    webBrowser.ObjectForScripting = this; 
    ...... 
    public void CallMeInForm(string something) 
    { 
     MessageBox.Show("Silverlight said: " + something); 
    } 
} 

यह आपके विंडोज फॉर्म प्रोजेक्ट के अंदर है। अपने सिल्वरलाइट ऐप के अंदर, आपको इस ऑब्जेक्टफॉरस्क्रिप्शन को लेने और उस पर विधियों का आह्वान करने की आवश्यकता है। ऊपर मेरे उदाहरण में विधि कॉल करने के लिए, निम्नलिखित लाइनों का उपयोग करें:

using System.Windows.Browser; 
...... 
ScriptObject myForm = (ScriptObject)HtmlPage.Window.GetProperty("external"); 
myForm.Invoke("CallMeInForm", "testing 1 2 3"); 

आह्वान आदेश आप हालांकि मुझे लगता है यह नहीं करना चाहते हैं यह बहुत ज्यादा आप हैं, तो आपके कार्य करने के लिए किसी भी संख्या और मानकों के प्रकार के पारित करने देता है चारों ओर जटिल डेटाटाइप पारित करने का प्रयास करें। लेकिन अगर आपको ऐसा करने की ज़रूरत है, तो आप हमेशा क्रमबद्धता का उपयोग कर सकते हैं।

आपके फॉर्म से सिल्वरलाइट फ़ंक्शन कॉल करना ट्रिकर दिशा प्रतीत होता है। मैंने अभी तक इसे पूरी तरह से नहीं देखा है।

अपने सिल्वरलाइट ऐप में, आप वेबपृष्ठ पर फ़ंक्शंस का पर्दाफाश करते हैं। ऐसा करने के लिए, HtmlPage.RegisterScriptableObject() फ़ंक्शन का उपयोग करें। दोबारा, आप किसी भी वर्ग में उन विधियों के साथ पास कर सकते हैं जिन्हें आप बेनकाब करना चाहते हैं। खुलासा करने के लिए एक विधि के लिए, आपको इसे [स्क्रिप्टबल मेम्बर] विशेषता के साथ चिह्नित करना होगा।

HtmlPage.RegisterScriptableObject("Page", this); 
...... 
[ScriptableMember] 
public void CallMeInSilverlight(string message) 
{ 
    HtmlPage.Window.Alert("The form said: " + message); 
} 

इस बिंदु पर, अपने विधि पृष्ठ पर मौजूद JavaScript के संपर्क में है और आप इसे इतना की तरह कह सकते हैं, यह मानते हुए आप अपने <object> तत्व को id="silverlightControl" कहा:

document.getElementById('silverlightControl').Content.Page.CallMeInSilverlight("testing 1 2 3"); 

सूचना Page संपत्ति? RegisterScriptableObject() पर कॉल ने हमें दिया है।अब, चलो एक साफ JavaScript विधि में इस लपेट:

<script type="text/javascript"> 
    function CallMe(message) { 
     var control = document.getElementById('silverlightControl'); 
     control.Content.Page.CallMeInSilverlight(message); 
    } 
</script> 

और अब हम विंडोज से CallMe() विधि कॉल कर सकते हैं ताकि तरह फॉर्म्स एप्लिकेशन:

public void CallToSilverlight() 
{ 
    webBrowser.InvokeScript("CallMe", new object[] { "testing 1 2 3" }); 
} 
+0

यह कमाल है! मुझे आशा है कि आप यह समझ सकते हैं कि इसे WebBrowser से WinForm तक कैसे काम करना है। मैंने वेब पर किसी और को यह नहीं देखा है (या यहां तक ​​कि कोशिश करें ...) तो यह अच्छा होगा अगर आप इसे समझ सकें। – NotDan

+0

क्या आपने कभी यह पता लगाया है कि मेजबान फॉर्म से सिल्वरलाइट को कैसे कॉल करें? – Shrike

0

एक Winform ऐप में सिल्वरलाइट बस खराब समाचार की तरह लगता है। इसका मतलब यह होगा कि आप एक ही ऐप में अलग-अलग सीएलआर के लिए दौड़ रहे हैं और इसे काम करने के लिए अतिरिक्त जटिलता से निपटना होगा। यदि संभव हो तो अपने ऐप के भीतर पूर्ण WPF का उपयोग करने पर विचार करें, इसके बजाय यहां आपको दिखाए गए link हैं।

+0

सिल्वरलाइट द्वारा प्रयोग किया जाता CoreCLR अन्य CLRS साथ प्रक्रिया में चल रहे के इस परिदृश्य का समर्थन करता है, तो यह एक समस्या नहीं है। –

+0

दिलचस्प, साझा करने के लिए धन्यवाद। मैं तनाव देने की कोशिश कर रहा था कि यद्यपि आप इसे कर सकते हैं, ऐसा करने की सलाह नहीं दी जा सकती है। अपनी इच्छानुसार प्रौद्योगिकी को झुकाव के लिए अभी भी एक साफ तरीका है। – smaclell

+0

उम्म ... कोरसीएलआर क्लाइंट पर चल रहा है। यह सर्वर पर नहीं चलता है यह करता है? – AnthonyWJones

1

Desklighter पर एक नज़र डालें। बिल्कुल वही नहीं जो आप खोज रहे हैं लेकिन यह सबूत है कि यह संभव होना चाहिए?

1

यदि आप केवल इतना वास्तव में सब करने की ज़रूरत डेस्कटॉप ऐप में होस्ट सिल्वरलाइट है, मैं आपको सलाह देता हूं कि आप Jeremiah Morrill की SilverlightViewport प्रोजेक्ट देखें। यह आपको एक WPF या XNA ऐप में सिल्वरलाइट एप्लिकेशन एम्बेड करने की अनुमति देता है। यह अभी भी बहुत अल्फा है, लेकिन आप इसे उपयोगी पा सकते हैं।

यहाँ अपनी भूख को गीला करने के लिए एक तस्वीर है:

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=silverlightviewport&DownloadId=97946

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