日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

WPF/Silverlight深度解决方案:(十六)传值实现

發布時間:2025/4/5 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF/Silverlight深度解决方案:(十六)传值实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

許多開發者在從.NET網站開發向Silverlight轉型過程中往往都會經歷一個比較郁悶的過度期:Silverlight作為鑲嵌在網頁中的插件,如何能像傳統ASP.NET網頁一樣實現頁面切換及參數傳遞等問題時常捆饒著大家。解決之道我們還得從本質談起。

ASP.NET網站主要是基于服務器端的開發(runat="server");由于在服務器中運行,因此ASPX動態頁面操作的都是服務器端對象,比如訪問服務器中的數據庫等;而Silverlight則是標準的客戶端插件(<object),如果去掉它的網頁外殼(out-of-browser),它的形態與客戶端軟件幾乎無差別,在安全使用范圍內它能與用戶的電腦直接進行數據交互;相反,如果想通過Silverlight去訪問網絡上某臺服務器中的數據庫,則必須勞駕第三者如WCF等作為傳輸中介。

因此,對于初學Silverlight的朋友我強烈建議大家深刻分清楚 服務器端 客戶端 的區別,就像當初在學習ASP.NET時,必須分清服務器端控件與客戶端控件的區別一樣。

大家先看個例子:我們創建一個Silverlight應用程序網站,此時整個解決方案中將包含兩個項目分別為Silverlight項目和Web網站項目,為了進行對比分析,我們在Web網站項目中添加一個ASP.NET頁面,然后分別在該兩個項目中均編寫代碼一模一樣的靜態類Global.cs

??? public static class Global {

??????? public static int num = 50;

}

接著在Index.aspx頁面中添加一個按鈕,每次點擊時num值增加50

Index.aspx

??? <div>

??????? <asp:Button ID="button1" Text="確定" runat="server" OnClick="button1_OnClick" />

??????? <asp:TextBox ID="textBox1" runat="server" />

??? </div>

Index.aspx.cs

??????? protected void button1_OnClick(object sender, EventArgs e) {

??????????? Global.num += 50;

??????????? textBox1.Text = Global.num.ToString();

??????? }

同樣在MainPage.xaml中添加一個按鈕,每次點擊時num值也增加50

MainPage.xaml:

??? <Canvas>

??????? <Button x:Name="button1" Content="確定" Click="button1_Click"/>

??????? <TextBox x:Name="textBox1" Canvas.Left="30" Width="85" />

??? </Canvas>

MainPage.xaml.cs

??????? private void Button1_Click(object sender, RoutedEventArgs e) {

??????????? Global.num += 50;

??????????? textBox1.Text = Global.num.ToString();

??????? }

嘗試一:用戶A訪問Index.aspx頁面,點擊1button1按鈕;接下來用戶B也訪問該頁面,同樣也點擊1次該按鈕;此時用戶B電腦中顯示的num值是多少?如果用戶A接下來又點擊了1次該按鈕,用戶A電腦中的textBox1最終顯示的num值是多少?

嘗試二:用戶A訪問Index.aspx頁面,點擊1次該頁面Silverlight程序MainPage中的button1按鈕;接下來用戶B也訪問該頁面的Silverlight程序,并點擊MainPage中的該按鈕1次,此時用戶B電腦中顯示的num值是多少?如果用戶A之后又點擊了1次該按鈕,用戶A電腦中的textBox1最終顯示的num值是多少?

這是非常深刻而有意義的例子,答案是什么?大家不妨自己練習一次。

到此,如果大家能充分理解服務器端與客戶端的區別,那么Silverlight中的傳值就相當好理解了。

ASP.NET網站開發中,由Index1.aspx跳轉到Index2.aspx并傳遞IDPWD參數,我們可以在Index1.aspx中通過Response.Redirect("Index2.aspx?ID={0}&PWD={1}",p1,p2);Server.Transfer("Index2.aspx……");等方式進行操作。而在Silverlight應用程序中,由MainPage1.xamlMainPage2.xaml切換則必須通過一個包含它們的第三者中介容器器類控件比如CanvasGrid等。因為雖然它們名字中都有個Page,但確切講它們并不是頁面,而本質是用戶控件;因此從一個控件向另一個控件傳值必須通過屬性或構造函數進行傳遞,且過程中還得移除掉MainPage1后再添加MainPage2

按照以上思路,我們首先在MainPage2.xaml.cs中定義好參數的屬性或則構造函數參數,例如:

??????? public long ID { get; set; }

??????? public string PWD { get; set; }

或者:

??????? public MainPage2(long id, string pwd) {

??????????? InitializeComponent();

??????? }

當需要由MainPage1MainPage2切換時,在CanvasGrid中我們先移除掉MainPage1實例:

LayoutRoot.Children.Remove(mainPage1);

然后攜帶參數創建MainPage2的實例:

???? MainPage2 mainPage2 = new MainPage2() {

???????? ID = p1,

???????? PWD = p2,

???????? ...

???? };

或者:

MainPage2 mainPage2 = new MainPage2(p1, p2,…);

?? 最后將mainPage2添加進LayoutRoot

LayoutRoot.Children.add(mainPage2);

?? 到此大家也應該感受到,如果您是初學Silverlight,并且假如您的大腦中里已經駐扎了較深刻的ASP.NET網站開發的知識經驗,那么您必須進行思維的轉變才能更快的融入到Silverlight的開發中。

接下來我們不妨再往更深層次的方向探索,MainPage的本質是繼承自UserControl的用戶控件(MainPage : UserControl),那么用戶控件的本質又是什么呢?其實不就是類(Class)嗎。因此,Silverlight中傳值的本質就是類與類之間的屬性值傳遞,此時我們可以嘗試將項目中所有的用戶控件都刪除掉,然后添加同樣名字的類進去,讓它們分別也繼承自UserControl,最后的執行效果一模一樣,大家是否已經領悟到什么了?

?? 沒錯,在傳統的ASP.NET網站開發中,我們是如何創建一個帶參數的類的實例的,那么在Silverlight中的做法也一模一樣;僅有的一點區別是Silverlight中繼承自UserControl的類擁有一個UI外殼,很形象的為它們冠以Page的名稱描述目的是讓開發者從ASP.NET網站開發向Silverlight轉型時更加親切,我們從VisualStudio新建Silverlight應用程序模板中得到證實。

最后再回到本文的開頭,我們通過兩種嘗試體驗了靜態變量在服務器端與客戶端的不同表現,結果也在意料之中,.NET網站中靜態變量存儲于服務器的內存中,因此所有用戶看到且操作的都是同一個變量對象。而Silverlight應用程序中的靜態變量則存儲于用戶各自的電腦內存中,也就是說每個用戶操作的都是自己電腦中的對象,這樣的特性我們是否也可以將之作為Silverlight傳值的媒介呢?

處理時只需Global.args = value;對該全局靜態變量進行賦值,然后不論切換到哪個控件,該控件需要參數時直接取用即可。歸納一下:Silverlight中的靜態變量在程序的啟動之初就駐扎用戶電腦內存,不存在多用戶并發,不僅方便,高效,自由;而且無須考慮控件的生命周期,實乃Silverlight項目開發的萬用利器。

小結:傳值僅僅是我們平常開發中會遇到的最常見問題之一,本文通過ASP.NET網頁與Silverlight控件的分析對比,目的旨在告訴大家Silverlight運行于客戶端上,這句話不僅僅是一個定義,而且還深刻蘊涵著Silverlight的原理以及運行機制,知其然且知其所以然在開發中解決各種問題才能更顯游刃有余。

作者:深藍色右手
出處:http://alamiye010.cnblogs.com/
本系列目錄及源碼下載:點擊進入(歡迎加入WPF/Silverlight小組 WPF/Silverlight博客團隊)
本文版權歸作者和博客園共有,歡迎轉載。但未經作者同意必須保留此段聲明,且在文章頁面顯著位置給出原文連接,否則保留追究法律責任的權利。

轉載于:https://www.cnblogs.com/alamiye010/archive/2010/06/17/1759611.html

總結

以上是生活随笔為你收集整理的WPF/Silverlight深度解决方案:(十六)传值实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。