Frame内容页向Frame页传值的问题。

http://bbs.silverlightchina.net/forum.php?mod=redirect&tid=7503&goto=lastpost#lastpost

问题来自于银光中国的ayurep 提出来的,因为他在其他论坛上面很久没解决,我觉得可能还是写出来做个问题解答一个小记录。

他的问题是:怎样在MainPage 的Frame包含的页面Page做的更改中值传到MainPage本身中。

      是的一般我们Page和Page 导航是用Url 或者是代理,他当时也是从这两个方面去想问题的,没有实现在当前Page做更改的值传到MainPage中。

其实解决的方法还是很容易的,我们获得MainPage不就行了么,当然这是我一个人的想法,我想可能还有其他的解决方法,欢迎大家指出。

小例子:

目标:修改MainPage中的一个Page的一个TextBox,并把这个值传到我们获取到得MainPage中一个TextBox中

      我新建了一个Navigation App在Home.xaml中如下,用TextChanged来改变值触发事件。

  
    
public partial class Home : Page
{
public Home()
{
InitializeComponent();
}

// Executes when the user navigates to this page.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}

MainPage mainPage
= (MainPage)App.Current.RootVisual;
private void textBoxInPage_TextChanged( object sender, TextChangedEventArgs e)
{
mainPage.textBoxInMainPage.Text
= ((TextBox)sender).Text;
}
}

xaml:

  
    
< Grid x:Name ="LayoutRoot" >
< ScrollViewer x:Name ="PageScrollViewer" Style =" {StaticResource PageScrollViewerStyle} " >

< StackPanel x:Name ="ContentStackPanel" >

< TextBlock x:Name ="HeaderText" Style =" {StaticResource HeaderTextStyle} "
Text
="Home" />
< TextBlock x:Name ="ContentText" Style =" {StaticResource ContentTextStyle} "
Text
="Home page content" />
< TextBox Height ="23" Name ="textBoxInPage" Width ="120" TextChanged ="textBoxInPage_TextChanged" />
</ StackPanel >

</ ScrollViewer >
</ Grid >

MainPage 很简单放了一个textBox

  
    
< Grid x:Name ="LayoutRoot" Style =" {StaticResource LayoutRootGridStyle} " >

< Border x:Name ="ContentBorder" Style =" {StaticResource ContentBorderStyle} " >

< navigation:Frame x:Name ="ContentFrame" Style =" {StaticResource ContentFrameStyle} "
Source
="/Home" Navigated ="ContentFrame_Navigated" NavigationFailed ="ContentFrame_NavigationFailed" >
< navigation:Frame.UriMapper >
< uriMapper:UriMapper >
< uriMapper:UriMapping Uri ="" MappedUri ="/Views/Home.xaml" />
< uriMapper:UriMapping Uri ="/{pageName}" MappedUri ="/Views/{pageName}.xaml" />
</ uriMapper:UriMapper >
</ navigation:Frame.UriMapper >
</ navigation:Frame >
</ Border >

< Grid x:Name ="NavigationGrid" Style =" {StaticResource NavigationGridStyle} " >

< Border x:Name ="BrandingBorder" Style =" {StaticResource BrandingBorderStyle} " >
< StackPanel x:Name ="BrandingStackPanel" Style =" {StaticResource BrandingStackPanelStyle} " >

< ContentControl Style =" {StaticResource LogoIcon} " />
< TextBlock x:Name ="ApplicationNameTextBlock" Style =" {StaticResource ApplicationNameStyle} "
Text
="Application Name" />

</ StackPanel >
</ Border >

< Border x:Name ="LinksBorder" Style =" {StaticResource LinksBorderStyle} " >
< StackPanel x:Name ="LinksStackPanel" Style =" {StaticResource LinksStackPanelStyle} " >

< HyperlinkButton x:Name ="Link1" Style =" {StaticResource LinkStyle} "
NavigateUri
="/Home" TargetName ="ContentFrame" Content ="home" />

< Rectangle x:Name ="Divider1" Style =" {StaticResource DividerStyle} " />

< HyperlinkButton x:Name ="Link2" Style =" {StaticResource LinkStyle} "
NavigateUri
="/About" TargetName ="ContentFrame" Content ="about" />

</ StackPanel >
</ Border >
< TextBox Height ="23" HorizontalAlignment ="Left" Margin ="293,13,0,0" Name ="textBoxInMainPage" VerticalAlignment ="Top" Width ="120" />
</ Grid >

</ Grid >
MainPage mainPage = (MainPage)App.Current.RootVisual; 直接就访问到了MainPage 然后得到textBoxInMainPage然后赋值,
是不是很简单啊~

PS:这里可能要注意一下,就是其实这个要看你的App.xaml 是怎么写的 ,这里我的RootVisual就是MainPage,
但是有些是MainPage放到了
BusyIndicator 要做个转换的。
比如ayurep 的例子 我们看他的App.xaml.
   
     
private void Application_Startup( object sender, StartupEventArgs e)
{
// 这使您可以将 XAML 文件中的控件绑定到 WebContext.Current 属性。
this .Resources.Add( " WebContext " , WebContext.Current);

// 如果使用 Windows 身份验证,或如果用户在上次登录尝试时选择了“使我保持登录状态”,则会自动对用户进行身份验证。
WebContext.Current.Authentication.LoadUser( this .Application_UserLoaded, null );

// 在执行 LoadUser 期间向用户显示一些 UI
// this.InitializeRootVisual();

if ( ! Application.Current.IsRunningOutOfBrowser)
this .InitializeRootVisual();
else
this .RootVisual = new OutofBrowserMainPage();
}
protected virtual void InitializeRootVisual()
{
AyurepSET.Controls.BusyIndicator busyIndicator
= new AyurepSET.Controls.BusyIndicator();
busyIndicator.Content
= new MainPage();
busyIndicator.HorizontalContentAlignment
= HorizontalAlignment.Stretch;
busyIndicator.VerticalContentAlignment
= VerticalAlignment.Stretch;

this .RootVisual = busyIndicator;
// this.RootVisual = new x();
}

这里明显就是放到BusyIndicator 中,所以我们要这样获得MainPage:

var busy = (AyurepSET.Controls.BusyIndicator)Application.Current.RootVisual;
var mainPage=(MainPage)busy.Content;

就是这一点小小的修改就可以咯 ,希望对大家有所帮助。

你可能感兴趣的:(frame)