如何在WPF文本框,richtextboxes和复选框上保存和加载用户输入

时间:2016-08-11 10:48:17

标签: c# wpf xaml

我试图为Windows创建一个简单的简单WPF应用程序,其想法是在PC上使用桌面rpg的字符表而不是纸上,因此布局只是很多文本框和复选框用于存储统计数据和两个用于注释和库存的richtext面板。

我很难找到一种有效的方法来在关闭应用程序时(或按下按钮)保存所有数据,然后在它再次打开时加载它,所有解决方案I&#到目前为止,我发现这样的小项目似乎过于复杂。 在这一点上,我坚持用我创建的相应设置加载每个字段,但考虑到字段的数量,它看起来并不真正有效,我认为这也会给我带来问题。富文本框。尽管如此,在关闭应用程序之前,我也不知道如何保存设置。

有没有办法将所有字段内容转储到文件中(可能是xml?)并加载它们或任何更简单的解决方案?我害怕我错过了一些东西,而且我错误地解决了一个可以很容易处理的问题,所以任何建议都非常感激。

我试图快速完成这件事,这只是我为我的团队制作的东西,最多可供4人使用,所以我并不担心关于最佳实践

3 个答案:

答案 0 :(得分:2)

您可以创建一个Dataset,在其中安排所有需要的数据(例如,您在RPG表上获得的每columntextbox)然后将给定的数据存储在row的1个Dataset并将其写入xml-file,可以在下次启动应用时加载:Code-Snippets:

创建数据集:

_dataSet = new DataSet();
          //possible dataset-settings can be implemented here
        _dataSet.Tables.Add(table) //adding a created table
        for (int i = 0; i < koordinaten.Count; i++) //filling the dataset's table with your data
        {
            DataRow row = table.NewRow();
            row["charclass"] = textBoxCharClass.Text;
            row["HP"] = textBoxCharHP.Text;
            //etc.
            table.Rows.Add(row);}

将数据集保存为xml-file:

        SaveFileDialog sfd = new SaveFileDialog();
        sfd.Filter = "XML-File|*.xml";
        sfd.Title = "Save Char-Information";
        sfd.ShowDialog();

        if (sfd.FileName != "")
        {
            System.IO.FileStream fs = (System.IO.FileStream) sfd.OpenFile();

            switch (sfd.FilterIndex)
            {
                case 1: dataset.WriteXml(fs, XmlWriteMode.WriteSchema);                   
            }

            fs.Close();
        }

打开xml文件:

OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "XML-File|*.xml";
        ofd.Title = "Open Char-Information";
        ofd.ShowDialog();

        if (ofd.FileName != "")
        {
            System.IO.FileStream fs = (System.IO.FileStream) ofd.OpenFile();

            switch (ofd.FilterIndex)
            {
                case 1: dataset.ReadXml(fs.Name, XmlReadMode.Auto);
            }
            fs.Close();

以下是DataSetDataTable MSDN文档,以防您需要更多信息:)

答案 1 :(得分:2)

除非这是最简单的应用程序,否则我肯定会拥有数据&#34; model&#34;表示可以保存,加载等的字符(在xaml序列化中构建简单易用),并将其绑定到UI。理想情况下,您有一个处理显示的View,一个ViewModel,它具有支持视图的所有属性和方法,以及一个表示数据自身的Model。这对你来说可能有些过分(除非你已经熟悉它),但如果没有,它就是MVVM模式并且是WPF的行业标准。只需要绑定一个对象就是一个&#34;快捷方式&#34;版本

public class Character : INotifyPropertyChanged
{
    private int age = 20;
    public int Age
    {
        get { return age; }
        set
        {
            if (age != value)
            {
                age = value;
                NotifyPropertyChanged("Age");
            }
        }
    }

    private string name = "Default Name";
    public string Name
    {
        get { return name; }
        set
        {
            if (name != value)
            {
                name = value;
                NotifyPropertyChanged("Name");
            }
        }
    }

    private ObservableCollection<Spells> spells = new ObservableCollection<Spells>();
    public ObservableCollection<Spells> Spells
    {
        get { return spells; }
        set
        {
            if (spells != value)
            {
                spells = value;
                NotifyPropertyChanged("Spells");
            }
        }
    }

    ...

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

需要一段时间吗?是。这是否意味着你有更多可用和可扩展的?是。如果你正在做这个练习只是因为你喜欢打字而不是在便条纸上打字,好吧 - 可能只是有屏幕上的文本框而且背后没有任何东西是可以接受的。

如果你这样做是为了最终添加功能而不是在屏幕上显示内容(例如,搜索&#39;或过滤咒语或异能,应用特定效果,如&#34;疲劳&#34 ;适当调整统计数据等)或特别是如果你想了解更多有关编程/软件开发的信息,那么肯定会付出额外的努力。

如果你真的只想制作一个可以写入的皮肤而只想要保存/加载这一功能,那么我觉得这可能有用。

如果您将所有UI组件命名为&#34; NameTextBox&#34;等等你可以使用反射循环它们并根据类型存储和检索信息。

例如:

    <StackPanel Margin="20">
        <TextBox x:Name="AgeTextBox"/>
        <TextBox x:Name="NameTextBox"/>
        <TextBox x:Name="Notes"/>
        <Button Content="Save" Click="Button_Click"/>
    </StackPanel>

我可以搜索所有文本框,并以通用方式执行我想要的内容。这只是输出到控制台,但您可以保存到文本文件,csv或xml:

        var fields = typeof(MainWindow).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
        foreach (FieldInfo FI in fields)
        {
            if (FI.FieldType == typeof(TextBox))
            {
                TextBox value = FI.GetValue(this) as TextBox;
                Console.WriteLine(FI.Name + ":" + value.Text);
            }
        }

enter image description here

产地:

AgeTextBox:23
NameTextBox:Bob Bobson
Notes:Is a very nice Character

类似的情况可以反过来。

答案 2 :(得分:0)

如果存储的数据不是敏感数据,您是否考虑过使用JSON / XML文件来保存输出?

使用JSON文件,您可以存储变量值(IE:复选框状态)以及任何所需文本框的文本(如果需要,也可以序列化,这有助于防止外部不必要的篡改,如果这成为问题)

然后在应用程序启动时从文件中读回数据。

我建议你看看@ JSON.net

,更具体地说是序列化为文件,

Serialize Json to file