WinRT - 将新项添加到XML并拒绝访问

时间:2013-03-13 12:03:34

标签: c# windows-8 winrt-xaml

我有一个简单的任务应用程序。我有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));
        }
    }

但当我clcik on addButton然后应用程序抛出异常访问被拒绝HRESULT:0x80070005(E_ACCESSDENIED)

它是由this.Frame.Navigate(typeof(MyTasks))引起的;当我删除这段代码然后看起来没问题时,只有ListView不包含我新添加的任务。

2 个答案:

答案 0 :(得分:0)

根据您的说明,听起来这就是一页(即您的代码显示在页面MyTasks中),并且您正在从页面导航回自身?我认为这本身就是一个问题,但它似乎对我来说至少在一个简单的情况下起作用。因此,我不确定抛出异常的位置,除非您OnNavigatedTo中的某些内容与您导航回同一页面的事实不相符。

总而言之,我建议不要采用这种方法,当你这样做时,你要拆除并重新创建页面和基础类。

将项添加到XML流时,将一个元素添加到ListView控件的ItemsSource任务集合中。假设你是一个ObservableCollection你会看到添加的反映,而不必像重新加载页面一样具有破坏性(我假设它只是重新读取你刚才写的文件?)

答案 1 :(得分:0)

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

然而,暂时忽略这一点,你还有另外一个问题。您永远不会明确关闭您的文件。这意味着如果您的页面足够快地导航到自己,那么您尝试打开的文件仍处于打开状态。这会导致访问被拒绝错误。要解决此问题,您需要在writeStream语句中包含using的用法:

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);
}