[WPF] アプリケーションの位置、サイズを保存する

バインディングを使ってWPFアプリケーションの位置、サイズをアプリケーション終了時に保存する方法を示します。
様々な方法がりますが、ここでは Properties.Settings.Default により設定を保存する方法を示します。この方法を応用して様々な属性を保存することが簡単にできます。

開発環境:
以下の開発環境で作成します。ただしWPF環境であれば恐らくすべて同じ方法で実現できると思います。

参考URL:

目次:
1. 新規プロジェクトを作成
2. 設定作成
3. XAML と 設定 をバインディング
4. 保存

 

1. 新規プロジェクトを作成

新規WPFアプリケーションプロジェクトを作成します。ここでは”SaveWpfAttribute”という名称でプロジェクトを作成しました。
最終的に (a)Window位置、(b)Windowサイズ、を保存するので、Windowのプロパティを下記の通りにしておきます。新規プロジェクトを作成したままにしておけば良いはずです。
あとWindowサイズをとりあえず 320×240 へ変更しておきました。

Visual Studio のこのときの画面状態です。
Visual Studio 画面

XAMLの全コードを以下に記載します。当然ながらすかすかです。
XAML 全コード

 

2. 設定 を作成

Visual Studio でプロジェクトのプロパティを開き、[設定]タブから下記の通り4つの名前を作成します。
posX と posY がWindowの位置、width と height がWindowのサイズ情報を扱います。
スコープは必ず”ユーザ”にします。”アプリケーション”にした場合は設定の保存を行えず、読み取り専用になります。
設定

 

3. XAML と 設定 をバインディング

XAMLの属性 と 設定 をバインディングします。
「xmlns:p="clr-namespace:SaveWpfAttribute.Properties"」の部分の”SaveWpfAttribute”は、プロジェクトの名前空間です。ここはそれぞれのプロジェクトの内容に合わせて変更します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:p="clr-namespace:SaveWpfAttribute.Properties"
    x:Class="SaveWpfAttribute.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="{Binding Source={x:Static p:Settings.Default}, Path=width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Height="{Binding Source={x:Static p:Settings.Default}, Path=height, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Left="{Binding Source={x:Static p:Settings.Default}, Path=posX, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Top="{Binding Source={x:Static p:Settings.Default}, Path=posY, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    >

    <Grid x:Name="LayoutRoot"/>

</Window>

 

4. 保存

プログラムを終了するときに現在の属性を保存します。
アプリケーションの Closed イベント発生時に Properties.Setting.Default.Save() を行うことで実施します。保存先は下記の通りです。
"C:\Users\%USENAME%\AppData\Local\SaveWpfAttribute\・・・\user.config"
ちなみに今回は実装しませんが、規定値へ強制的に戻すには Properties.Setting.Default.Reset() で行います。

[MainWindow.xaml]
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:p="clr-namespace:SaveWpfAttribute.Properties"
    x:Class="SaveWpfAttribute.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="{Binding Source={x:Static p:Settings.Default}, Path=width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Height="{Binding Source={x:Static p:Settings.Default}, Path=height, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Left="{Binding Source={x:Static p:Settings.Default}, Path=posX, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Top="{Binding Source={x:Static p:Settings.Default}, Path=posY, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Closed="Window_Closed"
    >

    <Grid x:Name="LayoutRoot"/>

</Window>

[MainWindow.xaml.cs]
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace SaveWpfAttribute
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
        }

        private void Window_Closed(object sender, System.EventArgs e)
        {
            Properties.Settings.Default.Save();
        }
    }
}

 

サンプルプログラム:ダウンロード
    作成: Visual Studio 2012


記載: 2012年12月23日 木下英俊