天天看點

Silverlight加載xap後通過反射互相調用方法及元素

在一個silverlight工程裡加載另一個xap之前我已經有寫過,不過如果加載後互相調用就沒有寫到,是以補充說明一下加載後兩個silverlight中互相調用方法和元素的使用。 

注意:請先參考本網站的《Silverlight3 加載其他xap》文章,再結合以下内容使用! 

1.在主程式裡調用加載的xap裡的方法: 

a.在被加載的silverlight裡添加一個方法提供給調用:

1:  public void test()

2:  {

3:      MessageBox.Show("hello Man");

4:  } 

複制代碼

b.在主silverlight程式中調用上邊的方法:

1:  Type t = element.GetType();

2:  MethodInfo m = t.GetMethod("test");

3:  m.Invoke(element,null); 

這裡請注意 

a)element是動态加載xpa後所得到的UIElement。(也就是被加載的silverlight,隻是加載後會以一個UIElement形式傳回) 

b) t.GetMethod("test"),這裡的參數是被加載程式的方法名。 

c)Invoke方法重點有于Null參數,如果被調用的方法是有參數的,我們就可以通過這個參數去傳遞。 

2.在被加載程式中調用主程式的方法。 

a.在主程式中定義一個相同的方法供加載程式調用:

1:  public void dothing()

3:      MessageBox.Show("haha");

b.在被調用程式中調用主的方法:

1:  Type t = App.Current.RootVisual.GetType();

2:  MethodInfo m = t.GetMethod("dothing");

3:  m.Invoke(App.Current.RootVisual,null); 

a) 這裡有興的是我們被加載後我們的App.Current不再是本程式的App.Current了。而是主程式的App.Current,而且 RootVisual就是我們的MainPage,大家可以參考app.xaml.cs檔案.由此我們可以對主程式為所欲為了。呵呵。 

b)通過 t.GetMethod("dothing");調用主程式中的方法。方法名為"dothing". 

c)m.Invoke調用方法并傳入null參數,即為無參方法。 

3.如何調用有參數的方法: 

a.假設要調用的方法的參數定義如下:

1:  public void dothing(int i,string s,double d)

b.我們可以通過以下方法傳遞參數:

3:  m.Invoke(App.Current.RootVisual,new object[3]{1,"string",2.2}); 

這裡請注意 m.Invoke的new object[3]{1,"string",2.2}這裡三個值對應的就是被調用方法的dothing(int i,string s,double d)三個參數。反之在主程式中調有和加裁程式使用方法相同。 

4.如何取得xaml元素: 

假設在被加載程式中在如上的xaml元素定義:

1: 

5:      mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

6:   

7: 

8:   

9:  

假設我們需要取得上邊所定義的button元素: 

a.在此button所有在cs檔案上中定義一個方法。并且此方法的傳回是一個button:

1:  public Button getButton()

3:      return bt;

b.在主程式調用并取得元素:

2:  MethodInfo m = t.GetMethod("getButton");

3:  Button takeButton = (Button)m.Invoke(element,null); 

如此即可取得被加載程式中的Button。 

5.在被加載程式中調用主程式的自定議屬性: 

a.在主程式中定義屬性:

1:  private string haha;

2: 

3:  public string Haha

4:  {

5:      get { return haha; }

6:      set { haha = value; }

7:  } 

b.利害GetProperties方法取得所有屬性:

2:  PropertyInfo[] p = t.GetProperties();

3:  var haha = p.First(h => h.Name.Equals("Haha"));

4:  haha.GetSetMethod().Invoke(App.Current.RootVisual, new object[1] {"yoyo" }); 

結束語: 

寫完這文章後有一個設想,可以通過這篇文章那寫的内容,開發一個sl的開發平台,讓使用者自己去開發sl項目。呵呵。。

REF:http://www.pin5i.com/showtopic-26082.html

本文轉自dotfun 51CTO部落格,原文連結:http://blog.51cto.com/dotfun/285190