我有一个简单的任务应用程序。我有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不包含我新添加的任务。
答案 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);
}