Livetを使ったC#のWPFプログラミング

システムとして機能が網羅されたサンプルをもとに、Livetを使ったC#のWPFシステムの開発技能を身に付ける為の学習サイト


7.コントロールボックス


「閉じる」ボタンを無効化

「システムの基本構成サンプル」では、ユーザーインターフェースである画面(window、page)では、画面の右上のコントロールボックスの「閉じる」ボタンは、システムの流れを中断させて障害発生の懸念がある為に使用不可に設定します。

Livetライブラリの名前空間がusingディレクティブに追加されています。

また、LivetWPFApplication1は、LivetのViewModelを継承すると書かれています。

XCloseButtonManager.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

using System.Windows.Interactivity;

//コントロールボックスの閉じるの無効化
using System.Windows.Interop;
using System.Runtime.InteropServices;

namespace LivetWPFApplication100.ViewModels
{
    public class XCloseButtonManager
    {
        //--------------------------------------------------------------
        //コントロールボックスの閉じるの無効化
        //--------------------------------------------------------------
        [DllImport("user32.dll")]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
        [DllImport("user32.dll")]
        private static extern bool EnableMenuItem(IntPtr hMenu, 
                        uint uIDEnableItem, uint uEnable);
        private const uint SC_CLOSE = 0xF060;
        private const uint MF_BYCOMMAND = 0x00000000;
        private const uint MF_GRAYED = 0x00000001;
        private const uint MF_ENABLED = 0x00000000;
        //--------------------------------------------------------------
        public static void Disable(Window window)
        {
            // 対象Windowが開かれているか探す
            if (window == null)
            {
                // 開かれてなかったらなにもしない
            }
            else
            {
                // 既に開かれていたらアクティブにする
                //------------------------------------------------------------
                //コントロールボックスの閉じるの無効化
                //------------------------------------------------------------
                WindowInteropHelper helper = new WindowInteropHelper(window);
                var hwnd = helper.Handle;

                IntPtr hMenu = GetSystemMenu(hwnd, false);
                if (hMenu != IntPtr.Zero)
                {
                    EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
                }
                //------------------------------------------------------------
            }
        }
        public static void Disable()
        {
                // 既に開かれていたらアクティブにする
                //------------------------------------------------------------
                //コントロールボックスの閉じるの無効化
                //------------------------------------------------------------
      		  var window = Application.Current.Windows.OfType
      		  <Window>().SingleOrDefault((w) => w.IsActive);
                WindowInteropHelper helper = new WindowInteropHelper(window);
                var hwnd = helper.Handle;

                IntPtr hMenu = GetSystemMenu(hwnd, false);
                if (hMenu != IntPtr.Zero)
                {
                    EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
                }
                //------------------------------------------------------------
        }
    }
}          

このクラスの呼び出しは、個々の画面のViewModelのInitializeメソッドに記述します。そして、namespaceを短縮するusingにLivetWPFApplication100.Modelsを指定して、
「using LivetWPFApplication100.Models;」と書きます。


MainViewModel.cs
public void Initialize()
{
	var window = Application.Current.Windows.OfType<Window>().
	             SingleOrDefault((w) => w.IsActive);
	XCloseButtonManager.Disable(window);
}