Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight Windows Phone 7:使用URI的墓碑?_Silverlight_Windows Phone 7_Tombstoning - Fatal编程技术网

Silverlight Windows Phone 7:使用URI的墓碑?

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

我正在Silverlight中构建wp7应用程序。我的应用程序的所有状态都存储在
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;
    }

    // ...