Silverlight Windows Phone导航-返回到之前的页面
我想点击一个按钮把我带到一个页面 ,然后单击列表框项目,单击新页面上的按钮并将其传递回页面,而不创建第一个页面的新URISilverlight Windows Phone导航-返回到之前的页面,silverlight,windows-phone-7,navigation,Silverlight,Windows Phone 7,Navigation,我想点击一个按钮把我带到一个页面 ,然后单击列表框项目,单击新页面上的按钮并将其传递回页面,而不创建第一个页面的新URI **First Page** private void btnAddExistingMember_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/ChooseMember.xaml", Uri
**First Page**
private void btnAddExistingMember_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/ChooseMember.xaml", UriKind.Relative));
}
**Second page after choosing listbox value**
private void btnAddSelected_Click(object sender, RoutedEventArgs e)
{
Member currMember = (Member)lstMembers.SelectedItem;
string memberID = currMember.ID.ToString();
//navigate back to first page here passing memberID
}
能做到吗
谢谢您可以创建一个包含成员id的manager类。然后可以从您的第一页和ChooseMember页访问此manager类 Singleton Manager类的一个示例:-
public class MyManager
{
private static MyManager _instance;
public static MyManager Instance
{
get
{
if (_instance == null)
{
_instance = new MyManager();
}
return _instance;
}
}
}
您可以将成员存储在App.xaml.cs文件中。这是应用程序中所有文件都可以访问的通用文件。 这就像一个全局变量
//App.xaml.cs
int datafield ;
//Page1xaml.cs
(App.Current as App).dataField =10;
//Page2.xaml.cs
int x = (App.Current as App).dataField
听起来好像您想将某个对象设置为另一个页面的上下文。MVVM Light中的消息传递听起来是一个很好的解决方案。看起来您使用的不是MVVM,因此这可能不会立即适用。我在这里说的基本上都是这样 第二页
创建SelectedObject属性并确保调用
RaisePropertyChanged(SelectedObjectPropertyName, oldValue, value, true);
最后一个参数true
表示向任何收听者广播此值的变化。您需要为listbox所选项目和按钮单击等连接一些其他命令,但我不会在这里讨论,因为它与您的问题没有直接关系。选择Listbox项将简单地为第一个页面设置您想要完成的数据项。点击按钮可以处理导航
第一页在视图模型构造函数中,注册以接收从第二页广播的更改
Messenger.Default.Register<PropertyChangedMessage<MyObject>>(this, (action) => UpdateObject(action.NewValue));
你可以简单地使用
//first page
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
string value = string.Empty;
IDictionary<string, string> queryString = this.NavigationContext.QueryString;
if (queryString.ContainsKey("memberID"))
{
memberID = queryString["memberID"];
if (memberID != "-1")
//your code here
}
base.OnNavigatedTo(e);
}
//second page
private void btnAddSelected_Click(object sender, RoutedEventArgs e)
{
Member currMember = (Member)lstMembers.SelectedItem;
string memberID = currMember.ID.ToString();
string target = "/FirstPage.xaml";
target += string.Format("?memberID={0}", memberID);
NavigationService.Navigate(new Uri(target, UriKind.Relative));
}
//第一页
受保护的覆盖无效OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
字符串值=string.Empty;
IDictionary queryString=this.NavigationContext.queryString;
if(queryString.ContainsKey(“memberID”))
{
memberID=queryString[“memberID”];
如果(成员ID!=“-1”)
//你的代码在这里
}
基地。导航到(e);
}
//第二页
私有无效btnAddSelected_单击(对象发送者,路由目标e)
{
成员currMember=(成员)lstMembers.SelectedItem;
字符串memberID=currMember.ID.ToString();
字符串target=“/FirstPage.xaml”;
target+=string.Format(“?memberID={0}”,memberID);
NavigationService.Navigate(新Uri(target,UriKind.Relative));
}
我在codeproject找到了一个对我非常有用的解决方案
从第二个表单移动时,将数据保存在PhoneApplicationService.Current.State
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
// Called when a page becomes the active page in a frame
base.OnNavigatedFrom(e);
// Text is param, you can define anything instead of Text
// but remember you need to further use same param.
PhoneApplicationService.Current.State["Text"] = txtboxvalue.Text;
}
使用相同的NavigationService.GoBack()返回
并在导航到方法的on中,获取以下代码
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (PhoneApplicationService.Current.State.ContainsKey("Text"))
txtvalue.Text = (string)PhoneApplicationService.Current.State["Text"];
}
参考资料:
MSDN:
原始解决方案位于:我对此非常陌生,您能告诉我如何将App.xaml.cs文件传递给它,然后重新检索它吗?如何使用第一个表单中的set成员访问manager类?创建manager类的新实例只会创建已设置成员的新实例。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面更改,只有链接的答案可能会无效。对不起,伙计们。改进了我的答案。现在请不要投反对票P@iDev,谢谢你,老兄,我是新来回答问题的。
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (PhoneApplicationService.Current.State.ContainsKey("Text"))
txtvalue.Text = (string)PhoneApplicationService.Current.State["Text"];
}