2016-08-11 15 views
0

Windows用のシンプルなWPFアプリケーションを作成しようとしていますが、アイデアはペーパーではなくPC上にテーブルトップRPGの文字シートを入れることですレイアウトは統計情報を保存するためのテキストボックスとチェックボックス、ノートとインベントリのための2つのリッチテキストパネルです。WPFのテキストボックス、リッチテキストボックス、チェックボックスにユーザー入力を保存してロードする方法

アプリを閉じる(またはボタンを押す)すべてのデータを効率的に保存してから、再び開いたときにデータを読み込むのは難しいです。このような小さなプロジェクトでは過度に複雑です。 この時点では、私が作成したそれぞれの設定ですべてのフィールドをロードすることに固執していますが、フィールドの数があれば効率的ではないようですが、これはリッチテキストボックス。それでも、私はまた、アプリケーションを閉じる前に設定を保存する方法の手がかりがありません。

ファイル内のすべてのフィールドコンテンツをダンプして(xmlかもしれませんか?)、ロードするか、より簡単なソリューションをロードする方法はありますか?私は何かが不足しているのではないかと心配しています。私は非常に簡単に処理できる問題を克服する間違った道にいるので、アドバイスは本当に感謝しています。私はこの事はすぐに行わ取得しようとしている

は、それは私がベストプラクティスについては本当に心配していないので、最大で4人によって使用されます私は私のグループのために作ってるだけで何か

答えて

2

あなたができましたDatasetを作成し、必要なすべてのデータを配置します(textboxの場合は1 column)。Datasetの1つのrowに1つのデータを保存し、xml-fileに書き込んでくださいコードスニペット:

データセットの作成:

_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ファイルとしてデータセットを保存:

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-ドキュメントは、場合にあなたがさらに必要だ:

 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ファイルを開きます情報:

0

保存されているデータが機密性のないものである場合は、あなたの出力を保存するためにJSON/XMLファイルを使用する必要がありますか?

JSONファイルを使用すると、変数値(IE:チェックボックス状態)と必要なテキストボックスのテキストを保存できます(必要に応じて、これがシリアル化されて外部からの不用意な改ざんを防ぎます) )。

次に、アプリケーションの起動時にファイルからデータを読み込みます。これは、私は間違いなくデータ「モデル」を持っていると思いアプリケーションの最も単純でない限り

私は、あなたがファイルにシリアライズするために、より具体的にJSON.net

@見て、

Serialize Json to file

2

をお勧めしますあなたが保存したり、ロードしたり(シンプルで簡単なxamlシリアル化でビルド)、そしてそれをUIにバインドすることができる文字を表します。理想的には、表示を扱うビュー、ビューをサポートするすべてのプロパティとメソッドを持つViewModel、およびデータ自体を表すモデルがあります。あなたには不慣れかもしれませんが(既に慣れていない限り)、そうでない場合は、MVVMパターンであり、WPFの業界標準です。単にバインドするオブジェクトを持つことは、 "ショートカット"バージョンです。

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

しばらく時間がかかりますか?はい。あなたははるかに使いやすく、拡張可能であることを意味するでしょうか?はい。メモ帳に書くだけで簡単に入力するのが好きなので、このエクササイズをやっているなら、大丈夫です。

最終的にスクリーン上に物を表示する以外の機能を追加したい場合(特に「検索」や呪文や能力のフィルタリング、統計情報を適切に調整する「疲れ」などの特定の効果を適用する)プログラミング/ソフトウェア開発についてもっと学びたい場合は、余計な努力を惜しみなく入れてください。

本当にあなたが書き込むことができるスキンを作ることに興味があるだけで、そこに保存/読み込み私が働くかもしれないと思う方法。

あなたのすべてのUIコンポーネントに「NameTextBox」などの名前を付けると、リフレクションを使用してそれらをループし、タイプに応じて情報を格納および取得できます。例えば

<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 

、同様のが逆に行うことができます。

+1

OOPの使い方の良い提案:オブジェクトの使用... :)答えを改善するために、モデルオブジェクトに直接バインディングするのではなく、ViewModelを使用することをお勧めします。次に、モデルをViewModelに渡すことができます(VMのプロパティを設定してください)。必要に応じてそのモデルのプロパティを更新します。そうすれば、「保存」をクリックしたときにキャラクターの詳細を保存する方法を設定することができます。それ以外の場合は、テキストボックスでプロパティを直接更新するだけです(つまり、ウィンドウを閉じて保存しないと、 dに変更されました) –

+1

はい、答えにフルMVVMを使用するかどうかはわかりませんでした。単にオブジェクトをあまりにも多く持っているかもしれないと感じている人には少し難しいかもしれません。私はそれを編集してオプションとして追加しますが、あまり詳しく説明しません。 – Joe

+0

私はそれが潜在的には少し難しいことに同意します。しかし、彼らが言うように "あなたが行くことを意味するように始めて..." *(誰でも)*。問題を解決する*正しい方法であると考えていることを示唆することには害はありません(同時に、潜在的に将来の深刻な問題も同時に起こります)。私はかつて、あなたがdownvoteの前に私の答えを考えているようなものだったので、答えた人の哲学を読んでいました:私はOPに答えようとしているのですか、または将来の問題/質問を防ぐより深刻な問題を解決しようとしています私はパラフレーズ、明らかに):) –

関連する問題