现在的位置: 首页 > 综合 > 正文

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

2012年07月08日 ⁄ 综合 ⁄ 共 4112字 ⁄ 字号 评论关闭
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;

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

抱歉!评论已关闭.