导航回Windows Phone 8.1应用程序中的主页面会导致异常

时间:2015-06-16 17:20:46

标签: c# xaml windows-phone-8.1

我第一次修改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));

    }
    }

}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

XAML:

d := "/some/dir/%s"
fmt.Sprintf(d, "hello") // Returns "/some/dir/hello"

CS:

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

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

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

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

答案 1 :(得分:0)

为什么不使用

    Frame.GoBack();

顺便说一下,我希望您确实意识到,当您在第二页上添加AddWorkOut并将其添加到MainPage中的List时,它只是将其保存在该会话的内存中。应用程序关闭时,您将丢失添加的数据。

我建议您从更持久的形式保存/读取数据,如

这很简单:

private IsolatedStorageSettings userSettings = IsolatedStorageSettings.ApplicationSettings;

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

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

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