2008-10-13 19 views
11

Bir winform tarayıcısı üzerinden winform'larda bir silverlight kontrolüne ev sahipliği yapmak isterim, ancak çalışabilmesi için formların gümüş ışığıyla ve bir şekilde diğerleriyle konuşmasının bir yoluna ihtiyacım var. Bir şekilde her ikisinin birbiriyle etkileşime girmesi mümkün mü? Örneğin, formu tarayıcının javascriptiyle konuşturun ve bunu silverlight kontrolüyle konuşturun mu? Daha iyi bir yolu var mı? Ya da bir şekilde bile? (kodu silverlight ve wpf olarak derlemekten başka)Winlight'lar içinde barındırılan Silverlight

cevap

15

Windows Forms WebBrowser denetimini kullanmanın en iyi yol olduğunu düşünüyorum. Bunu yapmak için bir web sayfasında Silverlight uygulamasına ihtiyacınız olacak, ardından WebBrowser'ınızı sayfanın URI'sine yönlendireceksiniz.

IE gibi davranan adresinin WebBrowser denetimi tutmak için, aşağıdaki ayarı öneriyoruz: Silverlight yapmak için yeterli kolaydır içinden formunuzda

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

çağrılması yöntemleri. Başlamak için, Silverlight'tan aramak istediğiniz tüm yöntemlere sahip bir sınıfa ihtiyacınız var. Formunuzu veya başka bir nesneyi kullanabilirsiniz, ancak sınıfı [ComVisible (true)] özniteliğiyle işaretlemeniz gerekir. Sonra nesneyi WebBrowser.ObjectForScripting özelliğine atarsınız. Bu, nesneyi web sayfasında "window.external" olarak gösterir.

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

Bu, Windows Forms projenizin içinde yer almaktadır. Silverlight uygulamanızın içinde, bu ObjectForScripting'i almanız ve üzerinde yöntemleri çağırmanız gerekir. Yukarıda benim örnekte yöntemini çağırmak için aşağıdaki satırları kullanın:

çağırır komut buna çok eğer istemem şüpheli olsa da, işlevinize herhangi bir sayıda parametre ve türünü geçmesine izin verir
using System.Windows.Browser; 
...... 
ScriptObject myForm = (ScriptObject)HtmlPage.Window.GetProperty("external"); 
myForm.Invoke("CallMeInForm", "testing 1 2 3"); 

karmaşık veri türlerini geçmeyi deneyin. Fakat bunu yapmanız gerekirse, her zaman serileştirme kullanabilirsiniz.

Silverlight işlevlerini çağırmak formunuzdan tricker yönü gibi görünüyor. Bunu henüz tam olarak anlamadım.

Silverlight uygulamanızda, işlevleri web sayfasına da yansıtırsınız. Bunu yapmak için HtmlPage.RegisterScriptableObject() işlevini kullanın. Yine, ortaya çıkarmak istediğiniz yöntemlerle herhangi bir sınıfa geçebilirsiniz. Ancak, bir yöntemin açıkta kalması için, [ScriptableMember] özniteliğiyle işaretlemeniz gerekir.

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

, senin yöntem sayfasındaki JavaScript maruz ve size <object> elemana id="silverlightControl" eklendi varsayarak şöyle diyebiliriz:

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

Bildirimi Page mülkiyet? RegisterScriptableObject() numaralı telefon bizi aradı.Şimdi, bir düzenli JavaScript yöntem haline sar bakalım:

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

Ve şimdi Windows'tan CallMe() yöntemini çağırabilirsiniz şöyle Forms uygulaması:

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

Bu harika! WebBrowser'dan WinForm'a nasıl çalışacağını anlayabilirsiniz. Bunu web'de başka kimseyi görmedim (ya da denedim ...), eğer bunu anlayabilirseniz harika olur. – NotDan

+0

, ev sahibi formdan Silverlight'ı nasıl arayacağınızı anladınız mı? – Shrike

0

Bir winform uygulamasında Silverlight, kötü haberlere benziyor. Bu, tek bir uygulamada farklı CLR'lere koştuğunuz anlamına gelir ve çalışmasını sağlamak için ek karmaşıklıklarla uğraşmak zorunda kalır. Mümkünse, uygulamanızın içinde tam WPF'yi kullanmayı düşünün. Bunun yerine, size nasıl gösterileceğini gösteren bir link.

+0

Silverlight tarafından kullanılan CoreCLR diğer CLRS ile işlemde çalışan bu senaryoyu desteklediği için, bu bir sorun değil:

İşte iştahınızı ıslak bir resim. –

+0

İlginç, paylaşım için teşekkürler. Bunu yapabilmenize rağmen, bunu yapmanın tavsiye edilmeyebileceğini vurgulamaya çalışıyordum. Teknolojiyi, iradenize doğru bükmenin düzgün bir yolu. – smaclell

+0

Umm ... CoreCLR, istemci üzerinde çalışıyor olacak. Sunucuda çalışmıyor mu? – AnthonyWJones

1

Desklighter'a bakın. Tam olarak aradığınız şey değil ama mümkün olması gerektiği kanıtı var mı?