[WPF] Windowを閉じずに隠しておくための実装

[WPF] Windowを閉じずに隠しておくための実装

WPF の画面表示が遅いので何とかしたい

WPFではリッチな画面を作れる反面、画面にコントロールが多い場合はそれなりのコストがかかってしまいます。

頻繁に画面を閉じたり開いたりする場合、開きっぱなしにしたほうが操作の体感速度が改善する場合があります。

ということでその方法をまとめます。

SubWindow を一度開いたら閉じずに隠したままにします。

再利用する画面をシングルトンにして、閉じずに隠す

SubWindow.xaml.cs

using System.Windows;

namespace WpfApplication1
{
    public partial class SubWindow : Window
    {
        private static SubWindow _Instance;
        public static SubWindow GetInstance()
        {
            if (_Instance == null)
            {
                _Instance = new SubWindow();
            }
            return _Instance;
        }

        private SubWindow()
        {
            InitializeComponent();
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // 閉じる処理をキャンセルして非表示にする
            e.Cancel = true;
            this.Hide();
        }
    }
}

シングルトンにすることでアプリケーション内で1つのインスタンスになることを強制します。ただそれだけでは閉じられてしまえば利用できなくなってしまうので、windowが閉じるイベントで処理そのものをキャンセルし、代わりに隠してしまいます。

Closing イベントハンドらを作成し、ここで取り消すことができます。

Hide() が Window を隠す処理です。この処理を実行すると、Window が非表示になり、非アクティブ化されます。

Hide() で非表示になっている Window は Show() で再度表示させることが可能です。

表示する方法

上で実装した再利用可能な画面を表示するには、以下のようにします。

SubWindow.GetInstance().Show();

インスタンスを取得し、これを Show() します。もし、インスタンスが生成されていなければ(初回表示であれば)、画面を生成して初期化したうえで表示されます。また、2回目以降の表示であれば前回閉じる代わりに隠した Window がそのまま表示されます。

表示内容等はそのままなので、適宜初期化なりを実装すればいい感じに使いまわせるはずです。

以上。

参考URL

ウィンドウを閉じないで非表示にするサンプル | Microsoft Docs)

.NET Frameworkカテゴリの最新記事