Silverlight Windows Phone 7:使用URI的墓碑?
我正在Silverlight中构建wp7应用程序。我的应用程序的所有状态都存储在Silverlight Windows Phone 7:使用URI的墓碑?,silverlight,windows-phone-7,tombstoning,Silverlight,Windows Phone 7,Tombstoning,我正在Silverlight中构建wp7应用程序。我的应用程序的所有状态都存储在NavigationContext.QueryString中。如果这可以在应用程序停用时保存,并且在应用程序重新激活时导航到该页面,那么就可以满足我的逻辑删除要求 然而,我不太确定如何做到这一点。我正在考虑将NavigationContext.QueryString保存到App.xaml.cs::Application_Deactivated()中的State字典中,但该代码无权访问NavigationContext
NavigationContext.QueryString
中。如果这可以在应用程序停用时保存,并且在应用程序重新激活时导航到该页面,那么就可以满足我的逻辑删除要求
然而,我不太确定如何做到这一点。我正在考虑将NavigationContext.QueryString
保存到App.xaml.cs::Application_Deactivated()
中的State
字典中,但该代码无权访问NavigationContext.QueryString
。还有别的办法吗
我想我可以在每次导航时将查询字符串保存到状态字典中,然后在应用程序重新激活时将其还原。还是有更好的方法
更新:根据indyfromoz的回答,我想实施以下内容
OnNavigatedToHandler()
{
// save NavigationContext.QueryString in the State dictionary
}
为了减少冗余,我想我应该在继承自PhoneApplicationPage
的类中实现这一点,然后让我的所有其余页面继承自该类。然而,我随后遇到了一个问题,即所有页面类都是partial
,因为它们也在生成的代码中定义。我不想更改生成的代码,因为每次重新生成代码时重新更改它将是一个巨大的痛苦
有更好的方法吗
更新2:以下是我现在在我的应用程序主页(启动时导航到的主页)中正在破解的内容:
public部分类mainprovot:PhoneApplicationPage
{
公共mainprovot()
{
初始化组件();
已加载+=新的路由EventHandler(主枢轴已加载);
PhoneApplicationService.Current.Deactivated+=新事件处理程序(应用程序已停用);
Show(“启动主数据透视(状态计数:“+PhoneApplicationService.Current.state.count+”));
如果(PhoneApplicationService.Current.State.Count!=0)
{
Assert(PhoneApplicationService.Current.State.ContainsKey(QueryStringKey)),
“状态已初始化,但不包含查询字符串的值”);
string oldQueryString=(string)PhoneApplicationService.Current.State[QueryStringKey];
Show(“旧查询字符串:”+oldQueryString);
NavigationService.Navigate(新Uri(旧QueryString));
}
}
公共只读字符串QueryStringKey=“queryString”;
无效应用程序已停用(对象发送器,停用EventTarget e)
{
PhoneApplicationService.Current.State[QueryStringKey]=NavigationService.Source;
}
// ...
它工作(有点)但很难看
更新3:看起来wp7操作系统将在基于页面的应用程序中自动重新加载正确的页面。事实上,我正在使用页面,因此可能我不需要在这里做太多工作
但是,它似乎不起作用。我启动应用程序,转到一个页面,点击“开始”,然后点击“返回”。屏幕上显示“正在恢复…”,但似乎挂在那里。我的代码在这一点上应该以某种方式响应吗?有没有办法即使在点击“开始”后仍保持调试器的连接?瞬态数据通常存储在中。数据存储在页面的OnNavigatedFrom事件中,并从页面的OnNavigatedTo事件中还原。如果您将页面URI中的参数存储在应用程序每个页面中可用的OnNavigatedFrom事件中的状态字典中,则可以实现e逻辑读取OnNavigatedTo事件中的参数,从而处理逻辑删除
HTH,indyfromoz对。对于每个页面,我希望
OnNavigatedFrom
方法相同-将当前URI保存到状态
。我想通过继承来实现这一点,但根据生成的代码,看起来我做不到。还有其他方法吗?你在应用程序中使用MVVM吗?我也使用过MVVMLightlkit并将Messenger类与“OnNavigatedFrom/OnNavigatedTo”和消息筛选器一起使用,以有效地存储应用程序中的数据。我的应用程序中没有明确使用MVVM。MVVMLight是否可用于Windows Phone 7?是的,MVVMLight可用于Windows Phone 7。请查看此页()以开始。
public partial class MainPivot : PhoneApplicationPage
{
public MainPivot()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPivot_Loaded);
PhoneApplicationService.Current.Deactivated += new EventHandler<DeactivatedEventArgs>(App_Deactivated);
MessageBox.Show("launching main pivot (state count: " + PhoneApplicationService.Current.State.Count + ")");
if (PhoneApplicationService.Current.State.Count != 0)
{
Debug.Assert(PhoneApplicationService.Current.State.ContainsKey(QueryStringKey),
"State is initialized, but contains no value for the query string");
string oldQueryString = (string)PhoneApplicationService.Current.State[QueryStringKey];
MessageBox.Show("Old query string: " + oldQueryString);
NavigationService.Navigate(new Uri(oldQueryString));
}
}
public readonly string QueryStringKey = "queryString";
void App_Deactivated(object sender, DeactivatedEventArgs e)
{
PhoneApplicationService.Current.State[QueryStringKey] = NavigationService.Source;
}
// ...