single.php

C# WinUI3 の[設定ファイル]でユーザー定義の構造体データを保存する手順

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回は[設定ファイル]で保存や呼び出しを行うデータにユーザー定義のクラス(構造体)データを追加する場合の対処法です。

[設定ファイル]項目

WinUI3のアプリで利用するデータの保存や呼び出しを行う[設定ファイル]があります。

レジストリや設定ファイルなどを用意せずに、アプリで利用するデータの保存や呼び出しが可能です。

[設定ファイル]はクラスの追加と同じ手順で[新しい項目の追加]画面から行います。。

追加を行うと[Settings.settings]を開いて設定ファイルで利用する編集を行います。

しかし[Settings.settings]の編集画面では[種類]の一覧で表示される変数型に限定されています。

[Settings.settings]の先頭部分には注意書きがあり、何らかの事由でコードが再生成された場合に編集した部分が消失してしまう場合がります。

そのため、数値や文字列型の変数を構造体のようにまとめたユーザー定義の変数の場合は[Settings.settings]画面やファイルの編集で設定が出来ません。

ユーザー定義変数の保存・呼び出しクラスを追加

[Settings.settings]でユーザー定義の構造体データを扱うには、呼び出しと保存する処理を追加したクラスを新しく用意します。

例えば、数値と文字列の2つの変数で構成される構造体データを[Settings.settings]に保存する場合は次の手順で行います。

public struct HOGEHOGE
{
  public double number;
  public string text;
}

1.[新しい項目の追加]画面で[クラス]の追加を行います。

2. 追加したクラスに次のコードを追加します。。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static WinUi3Samples.StoreWindowPlacementState;

namespace WinUi3Samples
{
  internal sealed partial class Settings
  {
    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("")]
    public HOGEHOGE HogeHoge
    {
      get
      {
        return ((HOGEHOGE)(this["HogeHoge"]));
      }
      set
      {
        this["HogeHoge"] = value;
      }
    }

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("")]
    public WINDOWPLACEMENT Wp
    {
      get
      {
        return ((WINDOWPLACEMENT)(this["Wp"]));
      }
      set
      {
        this["Wp"] = value;
      }
    }
  }
}

3. 読み込みと保存を検証するための画面を用意します。

<Window
  x:Class="WinUi3Samples.OriginStructureStoreSettings"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:WinUi3Samples"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d"
  Title="OriginStructureStoreSettings">

  <Grid>
    <StackPanel Margin="0,32,0,0">
      <NumberBox Name="NumberSetting" Width="100" Value="0" AcceptsExpression="True" />
      <TextBox Name="StringSetting" Width="100" Text="test" />
    </StackPanel>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
      <Button Name="LoadSetting" Click="LoadSetting_Click">Load Setting</Button>
      <Button Name="StoreSetting" Click="StoreSetting_Click">Store Setting</Button>
    </StackPanel>
  </Grid>
</Window>

public sealed partial class OriginStructureStoreSettings : Window
{
  public OriginStructureStoreSettings()
  {
    this.InitializeComponent();
  }

  private void LoadSetting_Click(object sender, RoutedEventArgs e)
  {
    HOGEHOGE HogeHoge = new HOGEHOGE();
    HogeHoge = Settings.Default.HogeHoge;
    NumberSetting.Value = HogeHoge.number;
    StringSetting.Text = HogeHoge.text;
  }

  private void StoreSetting_Click(object sender, RoutedEventArgs e)
  {
    HOGEHOGE HogeHoge = new HOGEHOGE();
    HogeHoge.number = NumberSetting.Value;
    HogeHoge.text = StringSetting.Text;
    Settings.Default.HogeHoge = HogeHoge;
    Settings.Default.Save();
  }
}

4.[NumberBox]と[TextBox]の内容を編集して[Store Setting]をクリック後に、アプリを再起動して[Load Setting]をクリックすると保存したデータが表示されます。

まとめ

今回は、WinUI3プロジェクトで、[設定ファイル]で保存や呼び出しを行うデータにユーザー定義のクラス(構造体)データを追加する場合の対処法について紹介しました。

[Settings.settings]では’string’ や ‘double’ など用意された型の変数を保存したり読み込む処理が簡単に実装できますが、構造体のような複合的な変数の場合を定義できません。

ユーザー定義の変数や構造体データなどを保存する場合には新しく[クラス]ファイルを追加して利用するデータに沿った処理を追加して保存や読み出しが可能です。

WinUI 3アプリでユーザー定義の変数や構造体を保存や読み出しを行いたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です