Windows Phone 編程中頁面間傳值方法 – [WP開發]

來源:互聯網
上載者:User

WP開發過程中有時會遇到頁面間轉值的需求,如果定義兩個頁面,一個是初始頁面Source Page,另外一個是跳轉的頁面Destination Page,簡單地分析主要有兩個方面的要求:

  • 首先是在source page跳轉到destination page時給destination page頁面傳值的實現;
  • 然後是當在destination page中調用goback函數回到source page時如何在source page傳值;

第一點系統本身提供了基本的實現方法,建立一個項目DataPassingDemo,然後建立一個頁面SecondPage.xaml,我們需要實現就是從MainPage中跳轉到SecondPage中去,並傳遞參數讓SecendPage捕捉。首先在Mainpage中增加一個Textblock並且增加事件處理函數:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            <TextBlock Text="Navigate to 2nd page with data" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="0 34"                        ManipulationStarted="TextBlock_ManipulationStarted"/>        </Grid>

在Mainpage的後台代碼中,實現TextBlock_ManipulationStarted方法如下:

private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args){            string destination = "/SecondPage.xaml?parameter1=hello&parameter2=world";          this.NavigationService.Navigate(new Uri(destination, UriKind.Relative));            args.Complete();            args.Handled = true;        }

可以看到上面的那個destination是不是很像網頁間傳遞參數的形式呢?同理在SecondPage中增加一個Textblock,並給該Textblock的ManipulationStarted事件中增加Goback()事件。同時,為了捕捉MainPage傳遞過來的參數,在SecondPage的後台代碼中實現下面的代碼:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args)        {            IDictionary<string, string> parameters = this.NavigationContext.QueryString;            if (parameters.ContainsKey("parameter1"))            {                string parameter1 = parameters["parameter1"];                string parameter2 = parameters["parameter2"];                txtblk.Text = String.Format("Parameter1 is:{0} and parameter2 is:{1}", parameter1, parameter2);            }            base.OnNavigatedTo(args);        }

 
通過重載OnNavigatedTo函數實現擷取傳遞過來的參數並在其中的一個TextBlock中顯示出來。

 

所以實現第一個傳值要求的方法很簡單,只要通過給NavigationService的目標頁面地址附帶上參數再由目標頁面擷取參數即可,而我們要注意的地方是,由於行動裝置設計的便捷性要求,我們應該避免那些很複雜的傳遞參數的設計,並且,在設計時要注意Windows Phone設計中的墓碑機制,才能設計出合理高效的WP應用。

 

接著我們來考慮第二個問題,如何在頁面間共用,傳遞資料。我們可以考慮到如果有一個是中間的“容器”可以存放一些公用的資料的話那且不是可以實現這個要求了嗎?這時如果熟悉Silverlight設計的話頭腦裡就會呈現出App這個類,由於所有的頁面都可以訪問到App這個類,所以我們可以把一些準備共用的資料放在App這個類中定義。就在上面那個例子中,我們在App類中增加一個公開變數:

public string SharedString { set; get; }

 

這時如果想在MainPage中給SecondPage傳遞參數的話則需要先訪問那個共用資料,這時的MainPage中的後台代碼如下:

private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args){    (Application.Current as App).SharedString = "Hello World";    this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));    args.Complete();}

 

即在訪問SecondPage前先修改那個共用資料的值,然後在SecondPage的OnNavigatedTo事件中代碼修改如下:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args){    string sharedString = (Application.Current as App).SharedString;    txtblk.Text = sharedString;    base.OnNavigatedTo(args);}

 

同理,如果想通過SecondPage向MainPage傳遞資料的話,只要在調用GoBack函數前修改那個共用資料的值再由MainPage中的OnNavigatedTo函數來擷取到相對應的資料即可。

到這裡我們已經基本可以實現上面的兩個要求了,但第二種方法只是一種取巧的方法,在邏輯及實現上都有不合理的地方,我們應該走思考另外一種更為合理與通用的實現方式,那就是OnNavigatedFrom這個函數了。大家可能會想,from不是很明顯嗎,我們就是通過from的原頁面跳到目標頁面的,那麼這個from有何用處呢。其實它的用處挺大的,例如,通過這個函數我們可以很好的解決上面提到的問題。

最後用一個例子去說明這種方式的具體實現,我們定義兩個頁面,和之前的類似,這次我們通過SecondPage返回的值去定義MainPage頁面的顏色,MainPage的後台代碼定義如下:

public partial class MainPage : PhoneApplicationPage    {        public MainPage()        {            InitializeComponent();        }        public Color? ReturnedColor { set; get; }        private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args)        {            this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));            args.Complete();            args.Handled = true;        }    }

 

這裡定義為Color?,因為返回的值有可能是非顏色的。而SecondPage中的後台代碼定義如下:

namespace DataPassingDemo{    public partial class SecondPage : PhoneApplicationPage    {        public SecondPage()        {            InitializeComponent();        }        Random rand = new Random();        private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args)        {            this.NavigationService.GoBack();            args.Complete();            args.Handled = true;        }        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)        {            if (ContentPanel.Background is SolidColorBrush)            {                Color clr = (ContentPanel.Background as SolidColorBrush).Color;                if (e.Content is MainPage)                    (e.Content as MainPage).ReturnedColor = clr;            }            base.OnNavigatedFrom(e);        }        protected override void OnManipulationStarted(ManipulationStartedEventArgs args)        {            ContentPanel.Background = new SolidColorBrush(                Color.FromArgb(255, (byte)rand.Next(255),                (byte)rand.Next(255),                (byte)rand.Next(255)));            base.OnManipulationStarted(args);        }    }}

我們通過獲得一個隨機數值組合而成的顏色設定為SecondPage的背景顏色,然後通過OnNavigatedFrom設定ReturnedColor為當前背景顏色,所以為了擷取SecondPage返回的ReturnedColor,在MainPage的後台代碼中還需要重載OnNavigatedTo方法響應這個OnNavigatedFrom:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args)        {            if (ReturnedColor != null)                ContentPanel.Background =                new SolidColorBrush(ReturnedColor.Value);            base.OnNavigatedTo(args);        }

 

通過OnNavigatedFrom與OnNavigatedTo,我們就完成了資料的傳遞過程。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.