使用frame,怎样向新page传递参数。

海涵德 2010-12-20 09:26:11
page1.xaml代码有带参数的构造函数,使用导航时怎样将参数传递给page1.xaml.vb,代码如下:
' mainpage.xaml
<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="SilverlightApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="100"></RowDefinition>
</Grid.RowDefinitions>

<StackPanel Grid.Row="0" Orientation="Horizontal" >
<Button x:Name="button_navigate" Content="navate" Margin="10 0 10 0" click="button_navigate_Click" ></Button>
</StackPanel >
<sdk:Frame x:Name="frame_bottom" JournalOwnership="OwnsJournal" ></sdk:Frame>
</Grid>
</UserControl>

' mainpage.xaml.vb
Private Sub button_navigate_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim _uri As System.Uri = New Uri("/views/Page1.xaml", UriKind.Relative)
frame_bottom.Navigate(_uri)
End Sub

'page1.xaml
<navigation:Page x:Class="SilverlightApplication1.Page3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
d:DesignWidth="640" d:DesignHeight="480"
Title="Page3 Page">
<Grid x:Name="LayoutRoot">
<TextBlock x:name="textblock_t" Text="Page3" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="100"></TextBlock>
</Grid>
</navigation:Page>

' page1.xaml.vb
Partial Public Class Page3
Inherits Page

Public Sub New(ByVal m As String)
InitializeComponent()

textblock_t.text=m
End Sub
End Class
...全文
1039 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weishumin 2010-12-30
  • 打赏
  • 举报
回复
同意11楼的看法,可以去网上搜搜看,这种资料很多的。
yitian130 2010-12-25
  • 打赏
  • 举报
回复
使用QueryString可以获取URL中的参数。也就是说你可以在跳转页面的时候使用地址栏参数传值。如下:
string uriText = String.Format("/Product.xaml?id={0}&type={1}",productID, productType);
mainFrame.Navigate(new Uri(uriText), UriKind.Relative);

这样你就可以传两个值到目标页面了 ..
然后在Priduct.xaml页面你就可以获取到值了:
int productID, type;
if (this.NavigationContext.QueryString.ContainsKey("productID"))
productID = Int32.Parse(this.NavigationContext.QueryString["productID"]);
if (this.NavigationContext.QueryString.ContainsKey("type"))
type = Int32.Parse(this.NavigationContext.QueryString["type"]);
海涵德 2010-12-22
  • 打赏
  • 举报
回复
主题事件要产生很多动作,并不仅仅是ui中的元素,所以还是使用自己定义的模式为好。
Sunpire 2010-12-22
  • 打赏
  • 举报
回复
呵呵,你没说要传递对象啊。

对于非常简单的对象,序列化后还是可以通过查询字符串来传递的,不过一般不会这么做的,只是理论上可行。

我自己的做法是采用一个全局的 Dictionary<string,TEntity> 或是 队列,仅供参考

/// <summary>
/// 用于存储临时的数据
/// </summary>
private static Dictionary<string, System.Data.Objects.DataClasses.EntityObject> dictTempDatas = new Dictionary<string, System.Data.Objects.DataClasses.EntityObject>();
/// <summary>
/// 获取临时数据,并从存储区中删除
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static System.Data.Objects.DataClasses.EntityObject PopupTemporaryEntity(string key)
{
if (dictTempDatas.ContainsKey(key))
{
System.Data.Objects.DataClasses.EntityObject data = dictTempDatas[key];
dictTempDatas.Remove(key);
return data;
}
else
{
return null;
}
}
/// <summary>
/// 将临时数据存入存储区
/// </summary>
/// <param name="key"></param>
/// <param name="data"></param>
public static void PushTemporaryEntity(string key , System.Data.Objects.DataClasses.EntityObject data)
{
if (! dictTempDatas.ContainsKey(key))
{
dictTempDatas.Add(key, data);
}
else
{
dictTempDatas[key] = data;
}
}


查询字符串就只是把 key 带过去,或者根本就不使用查询字符串。

和5楼的方法类似
Sunpire 2010-12-22
  • 打赏
  • 举报
回复
我觉得.NET 中的事件模型(多播)就是“观察者模式”的一种应用,或者说是一种实现吧。

到了 MVVM 中,如果是实现了INotifyPropertyChanged的实体,由于属性的 setter 要触发 PropertyChanged ,
而前台UI的绑定机制已经侦听了这个事件,“观察者模式”已经隐式的被实现了。

不过要注意跨线程的情况,前台UI的绑定一般是由主线程所拥有,PropertyChanged 事件如果是
由其他线程触发,则要注意跨线程的问题。
海涵德 2010-12-22
  • 打赏
  • 举报
回复
没有注意5楼的建议,确实看来可行。我使用的是“观察者模式”,主题subject是要共享的,我试试5楼的办法在app中定义一个共享主题,看看“观察者模式”的机制能不能起作用。
另,使用序列化是不能带来对象实例的,只能带来形式化的对象没有什么用,不能实现“观察者模式”。
海涵德 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sunpire 的回复:]
海大哥,使用导航是不使用 Page3 的构造函数的,而是在 Page3 的
protected override void OnNavigatedTo(NavigationEventArgs e){}

中对导航参数 e.Uri.OriginalString 进行分解, 就像分解.aspx Url 中的 QueryString 一样,
然后根据不同的参数进行相应的初始化。

OnNav……
[/Quote]查询字符串是不能传递对象的。
dui_cky 2010-12-22
  • 打赏
  • 举报
回复

还有种方法,在APP类中定义一个 Object 类型的 对象, 把要传的参数放入此对象中, 跳转后的页面直接来app 类中取值就行了
Sunpire 2010-12-21
  • 打赏
  • 举报
回复
海大哥,使用导航是不使用 Page3 的构造函数的,而是在 Page3 的
protected override void OnNavigatedTo(NavigationEventArgs e){}

中对导航参数 e.Uri.OriginalString 进行分解, 就像分解.aspx Url 中的 QueryString 一样,
然后根据不同的参数进行相应的初始化。

OnNavigatedTo 发生在 Page.Loaded 之前。
海涵德 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jimmy_xiao0010 的回复:]
其实可以用frame.content 属性.

比如你要创建的page1.xaml 的类名为A
A a = new A(string str);

frame.content = a;
[/Quote]
是挺简单的,但是新页的导航属性都没了如:

If Me.NavigationService.CanGoForward Then
Me.NavigationService.GoForward()
End If

怎样让NavigationService对象起作用。
helloWorld1209 2010-12-20
  • 打赏
  • 举报
回复
其实可以用frame.content 属性.

比如你要创建的page1.xaml 的类名为A
A a = new A(string str);

frame.content = a;

passself 2010-12-20
  • 打赏
  • 举报
回复
不知道这个有没有session之类的东西,是可以跨页面的,如果没有那只能用http协议来传参

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧