0

我有一个简单的任务应用程序。我有 taskTextBox、addButton 和 tasksListView,其中显示了任务。我以这种方式将新项目添加到 XML 文件中:

    private async void addButton_Click_1(object sender, RoutedEventArgs e)
    {
        try
        {
            var folder = ApplicationData.Current.LocalFolder;
            var file = await folder.GetFileAsync("tasks.xml");
            var readStream = await FileIO.ReadTextAsync(file);
            var writeStream = await file.OpenStreamForWriteAsync();

            XElement xElem = XElement.Parse(readStream);

            xElem.Add(new XElement("Task",
                new XElement("Id", Guid.NewGuid()),
                new XElement("Name", QuickTaskTextBox.Text.ToString())
            ));

            xElem.Save(writeStream);

            taskTextBox.Text = "";
        }
        catch (Exception ex)
        {
            new MessageDialog(ex.Message).ShowAsync();
        }
        finally
        {
            this.Frame.Navigate(typeof(MyTasks));
        }
    }

但是当我在 addButton 上单击时,应用程序会抛出异常访问被拒绝 HRESULT: 0x80070005 (E_ACCESSDENIED)

它是由 this.Frame.Navigate(typeof(MyTasks)); 当我删除此代码时,一切看起来都不错,只有 ListView 不包含我新添加的任务。

4

2 回答 2

0

您可能应该更改页面,使其不会导航到自身。

但是,暂时忽略这一点,您还有另一个问题。您永远不会明确关闭您的文件。这意味着如果您的页面导航到自身的速度足够快,那么您尝试打开的文件仍然处于打开状态。这会导致访问被拒绝错误。要解决这个问题,您需要writeStreamusing语句中包装使用 of:

var readStream = await FileIO.ReadTextAsync(file);
using (var writeStream = await file.OpenStreamForWriteAsync())
{
    XElement xElem = XElement.Parse(readStream);

    xElem.Add(new XElement("Task",
        new XElement("Id", Guid.NewGuid()),
        new XElement("Name", QuickTaskTextBox.Text.ToString())
    ));

    xElem.Save(writeStream);
}
于 2013-03-14T04:12:45.127 回答
0

根据您的描述,这听起来像是一页(即您的代码出现在页面中MyTasks),并且您正在从页面导航回自身?我原以为这本身就是一个问题,但它似乎至少对我来说是一个简单的案例。所以我不确定异常是在哪里引发的,除非你的某些东西OnNavigatedTo不喜欢你导航回同一页面的事实。

最重要的是,我建议不要使用这种方法,当你这样做时,你正在拆除并重新创建页面和基础类。

将项目添加到 XML 流时,将元素添加到任务集合中,该集合是ItemsSourceListView 控件的。假设这是一个ObservableCollection,您将看到添加的内容反映而无需执行像重新加载页面这样的破坏性操作(我假设只是重新读取您刚刚编写的文件?)

于 2013-03-14T01:13:37.957 回答