我正在尝试使用Visual Studio创建一个UWP应用,该应用将2个文本框和1个DatePicker保存并读取到一个文件中,但是我不知道该怎么做。 保存数据现在应该可以正常工作,这是我的方法:
public async Task SaveDataInLocalFile(KalenderClass data)
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
XmlSerializer serializer = new XmlSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.ReadWrite))
{
TextWriter writer = new StreamWriter(stream.AsStream());
serializer.Serialize(writer, data);
}
}
这是我的安全按钮的外观:
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
KalenderClass kc = new KalenderClass();
kc.Termin = TerminTextBlock.Text;
kc.Person = PersonTextBlock.Text;
kc.Datum = DatePicker1.Date;
await SaveDataInLocalFile(kc);
}
这就是我的阅读按钮的外观:
private async void ReadButton_Click(object sender, RoutedEventArgs e)
{
var data = await GetDataFromLocalFile();
TerminTextBlock.Text = data.Termin;
}
现在的问题是xml文件已序列化,我不知道如何反序列化ist。
新的保存和读取方法:
public async Task SaveDataInLocalFile(KalenderClass data)
{
var localFolder = ApplicationData.Current.LocalFolder;
TerminTextbox.Text = localFolder.Path;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.ReadWrite))
{
serializer.WriteObject(stream.AsStreamForWrite(), data);
}
}
public async Task<KalenderClass> GetDataFromLocalFile()
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.Read))
{
var data = serializer.ReadObject(stream.AsStream()) as KalenderClass;
return data;
}
}
保存并读取按钮:
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
KalenderClass kc = new KalenderClass();
kc.Termin = TerminTextbox.Text;
kc.Person = PersonTextbox.Text;
kc.Datum = DatePicker1.Date;
await SaveDataInLocalFile(kc);
showDialog("Daten wurden in Daten geschrieben");
}
private async void ReadButton_Click(object sender, RoutedEventArgs e)
{
KalenderClass data = await GetDataFromLocalFile();
PersonTextbox.Text = data.Termin;
}
答案 0 :(得分:1)
ApplicationData
的全名是Windows.Storage.ApplicationData
。
如果只想输入ApplicationData
,则需要在文件头中添加对命名空间的引用:
using Windows.Storage;
...
var localFolder = ApplicationData.Current.LocalFolder;
如果您想知道保存的文件路径,可以使用以下代码:
var localFolder = ApplicationData.Current.LocalFolder;
string path = localFolder.Path;
您可以在调试过程中中断程序并检查path的值。
更新
反序列化方法
public async Task<KalenderClass> GetDataFromLocalFile()
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
XmlSerializer serializer = new XmlSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.Read))
{
var data = serializer.Deserialize(stream.AsStream()) as KalenderClass;
return data;
}
}
Update2
问题出在DateTimeOffset
上,XmlSerializer
当前对DateTimeOffset
的支持有限,您可以考虑使用DataContractSerializer
代替XmlSerializer
。
public async Task SaveDataInLocalFile(KalenderClass data)
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.ReadWrite))
{
serializer.WriteObject(stream.AsStreamForWrite(), data);
}
}
public async Task<KalenderClass> GetDataFromLocalFile()
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.Read))
{
var data = serializer.ReadObject(stream.AsStream()) as KalenderClass;
return data;
}
}
谢谢。
答案 1 :(得分:0)
Kalender.xaml.cs:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Storage;
// Die Elementvorlage "Leere Seite" wird unter https://go.microsoft.com/fwlink/?LinkId=234238 dokumentiert.
namespace Studienarbeit
{
/// <summary>
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann.
/// </summary>
public sealed partial class Kalender : Page
{
//List<KalenderClass> ls;
public Kalender()
{
this.InitializeComponent();
}
public async Task SaveDataInLocalFile(KalenderClass data)
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
XmlSerializer serializer = new XmlSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.ReadWrite))
{
TextWriter writer = new StreamWriter(stream.AsStream());
serializer.Serialize(writer, data);
}
}
private async void showDialog(string message)
{
var window = new Windows.UI.Popups.MessageDialog("Achtung", message);
await window.ShowAsync();
}
private void ButtonStartseite_Copy_Click(object sender, RoutedEventArgs e)
{
}
private void ButtonStartseite_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(MainPage));
}
private void TerminTextBlock_SelectionChanged(object sender, RoutedEventArgs e)
{
}
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
KalenderClass kc = new KalenderClass();
kc.Termin = TerminTextBlock.Text;
kc.Person = PersonTextBlock.Text;
kc.Datum = DatePicker1.Date;
await SaveDataInLocalFile(kc);
showDialog("Daten wurden in Daten geschrieben");
}
private async void ReadButton_Click(object sender, RoutedEventArgs e)
{
var data = await GetDataFromLocalFile();
TerminTextBlock.Text = data.Termin;
}
public async Task<KalenderClass> GetDataFromLocalFile()
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
XmlSerializer serializer = new XmlSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.Read))
{
var data = serializer.Deserialize(stream.AsStream()) as KalenderClass;
return data;
}
}
private void TerminTextbox_TextChanged(object sender, TextChangedEventArgs e)
{
}
}
}
KalenderClass.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
namespace Studienarbeit
{
public class KalenderClass
{
public string Termin { get; set; }
public DateTimeOffset Datum { get; set; }
public string Person { get; set; }
}
}