【问题标题】:Navigating back to Main Page in Windows Phone 8.1 app causes exception在 Windows Phone 8.1 应用程序中导航回主页会导致异常
【发布时间】:2015-06-16 17:20:45
【问题描述】:

我第一次尝试创建 Windows Phone 应用程序,但遇到了一些问题。

我的程序有两个页面 - 主页面有一个锻炼列表(目前已预先填充)和三个按钮。当按下“添加”按钮时,您将导航到第二页,该页面有一个文本框和另一个“添加”按钮。我正在尝试使添加按钮更新锻炼列表(这似乎有效)并导航回 MainPage。

我尝试了两种方法来实现这一点 - 我在“this.Frame.Navigate(typeof(MainPage));”中添加了到添加按钮。我还添加了一个“按下后退按钮”处理程序以返回到最后一页。

在启用导航代码时按下“添加”按钮每次都会导致异常。如果您导航到页面并在点击添加按钮之前点击后退按钮,则页面会毫无问题地返回。但是,如果您点击“添加”然后尝试返回,则会再次引发异常。

这是主页的代码。

namespace GuidedWorkout
{


public sealed partial class MainPage : Page
{
    public static List<string> allWorkouts = new List<string>();

    public string textInfo { get; set; }
    public MainPage()
    {
        this.InitializeComponent();
        this.NavigationCacheMode = NavigationCacheMode.Required;

        Workouts Workout = new Workouts("Chest Day");
        Workouts Workout3 = new Workouts("Leg Day");
        Workouts workout2 = new Workouts("Arms Day");
        allWorkoutsList.ItemsSource = allWorkouts;
    }


    /// <summary>
    /// Invoked when this page is about to be displayed in a Frame.
    /// </summary>
    /// <param name="e">Event data that describes how this page was reached.
    /// This parameter is typically used to configure the page.</param>
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {

    }

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        //this.allWorkoutsList.ItemContainerGenerator.ContainerFromItem();
        //textInfo = (sender as ListBox).SelectedItem.ToString();
        //textInfo = lbi.Content.ToString();
        //this.titleBlock.Text = textInfo;
    }



    private void addWorkoutButton_Click(object sender, RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(GuidedWorkout.AddWorkout));
    }
}

这是第二页的代码。

namespace GuidedWorkout
{

public sealed partial class AddWorkout : Page
{
    public AddWorkout()
    {
        this.InitializeComponent();
        HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }

    void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        Frame rootFrame = Window.Current.Content as Frame;
        if(rootFrame != null && rootFrame.CanGoBack)
        {
            rootFrame.GoBack();
            e.Handled = true;

        }

    }

    private void addWorkoutButton_Tapped(object sender, TappedRoutedEventArgs e)
    {
        string wName;
        wName = workoutTextBox.Text.ToString();
        Workouts addedWorkout = new Workouts(wName);
        MainPage.allWorkouts.Add(addedWorkout.workoutName);
        //this.Frame.Navigate(typeof(GuidedWorkout.MainPage));

    }
    }

}

感谢您的帮助。

【问题讨论】:

  • 有什么异常?顺便说一句,我在一个商业 Windows Phone 应用程序上工作,其中导航到的页面只是在主页上激活的控件。按下后退按钮只是将可见性更改为隐藏。
  • 我不确定如何获得实际的异常。每当我尝试返回时,应用程序崩溃并且 VS 会转到“App.gics”页面并突出显示“#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION UnhandledException += (sender, e) => { if (global::System.Diagnostics .Debugger.IsAttached) global::System.Diagnostics.Debugger.Break(); }; #endif" 有什么地方可以更好地描述异常吗?
  • ">GuidedWorkout.exe!GuidedWorkout.App.InitializeComponent.AnonymousMethod__2(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e) Line 50 C#"
  • 您需要向我们提供 e 参数的详细信息。您在此处提供给我们的代码并没有多大帮助,因为它是一般的 Unhandled Exception sn-p。
  • 不要将代码放在 cmets 中,您可以使用该信息主动编辑您的帖子。然后只需在“@omegaman 查看我更新的帖子”之类的评论中喊出某人来回复他们作为评论答案。

标签: c# xaml windows-phone-8.1


【解决方案1】:

为什么不直接使用

    Frame.GoBack();

顺便说一句,我希望您意识到,当您在第二页上添加工作并将其添加到 MainPage 中的列表时,它只是将其保存在该会话的内存中。应用程序关闭的那一刻,您将丢失添加的数据。

我会建议您从更持久的表单中保存/读取数据,例如

就这么简单:

private IsolatedStorageSettings userSettings = IsolatedStorageSettings.ApplicationSettings;

// to add
userSettings.Add("testdata"); 
userSettings.Save();

//to read
string xx = userSettings[“SomeValue”].ToString();

如果您想扩展,请考虑其他方式,例如数据库。

【讨论】:

  • 非常感谢您提供的信息!我最终放弃了这个项目并重新开始,因为这是第一个项目,而且我搞砸了很多东西。它第二次起作用了。找出如何持久化数据肯定在我的清单上,所以这个评论非常有帮助。再次感谢。
【解决方案2】:

使用超链接按钮,而不是按钮。

xaml:

<HyperlinkButton Content="My Label"            
                 Click="HyperlinkButton_Click" />

cs:

// Navigate to MainPage.
private void HyperlinkButton_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    // TO DO
    this.Frame.Navigate(typeof(MainPage));
}

根据需要,将此方法与 MainPage 的 OnNavigatedTo 方法结合使用。

此外,如果您想在返回页面时更新页面:

// Dont want to keep cached data.
this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Disabled;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多