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をclcikすると、アプリケーションは例外アクセスをスローします。HRESULT:0x80070005(E_ACCESSDENIED)

this.Frame.Navigate(typeof(MyTasks));が原因です。このコードを削除すると、すべてが正常に見えますが、ListViewにのみ新しく追加されたタスクが含まれていません。

4

2 に答える 2

0

あなたの説明から、これはすべて1ページであるように聞こえます(つまり、コードはページに表示されますMyTasks)、そしてあなたはページからそれ自体に戻ってナビゲートしていますか?それ自体が問題になると思っていたのですが、少なくとも私にとっては単純なケースではうまくいくようです。したがってOnNavigatedTo、同じページに戻っているという事実が気に入らない場合を除いて、例外がどこにスローされるかはわかりません。

結論として、このアプローチには反対することをお勧めします。そうすることで、ページと基礎となるクラスを破棄して再作成することになります。

アイテムをXMLストリームに追加するときItemsSourceは、ListViewコントロールのタスクのコレクションに要素を追加します。それがObservableCollectionであると仮定すると、ページをリロードするような混乱を招くようなことをしなくても、追加が反映されていることがわかります(これは、今書いたファイルを再読み取りするだけだと思いますか?)

于 2013-03-14T01:13:37.957 に答える
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);
}
于 2013-03-14T04:12:45.127 に答える