WindowsXamlHost コントロールのあるフォームの2度目の表示でエラーが発生する - C#

WindowsXamlHost コントロールのあるフォームの2度目の表示でエラーが発生する現象について紹介します。

現象の確認

Windows Formアプリケーションを作成し、WindowsXamlHost コントロールが利用できる状態にします。詳しくはこちらの記事を参照してください。

UI

フォームを2枚作成します。下図のUIを作成します。
メインのフォームにはボタンを1つ配置します。


サブのフォームには WindowsXamlHost コントロールを配置します。また、WindowsXamlHostコントロールの InitialTypeName プロパティに "Windows.UI.Xaml.Controls.TextBox"の値を設定します。


コード

下記のコードを記述します。メインフォームのボタンのClickイベントを実装します。サブフォームにはWindowsXamlHost コントロールの初期化コードを記述します。
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UwpHostFormClose
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      FormSub fs = new FormSub();
      fs.Show();
    }
  }
}

FormSub.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Toolkit.Forms.UI.XamlHost;

namespace UwpHostFormClose
{
  public partial class FormSub : Form
  {
    public FormSub()
    {
      InitializeComponent();
    }

    private void windowsXamlHost1_ChildChanged(object sender, EventArgs e)
    {
      WindowsXamlHost host = (WindowsXamlHost)sender;
      Windows.UI.Xaml.Controls.TextBox textBox = (Windows.UI.Xaml.Controls.TextBox)host.Child;
      textBox.Width = host.Width;
      textBox.Height = host.Height;
    }
  }
}

解説

ボタンをクリックするとサブフォームを表示します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。サブフォームが表示されます。


サブフォームのUWPコントロールが動作することを確認します。


動作確認後サブフォームを閉じます。フォームを閉じた後で再度[button1]をクリックします。


通常であればフォームが再度表示されますが、下図のSystem.Exceptionが発生します。ウィンドウハンドルが無効の旨の例外が発生します。

原因

UWPのコントロール生成時にメインウィンドウのハンドルを必要する動作が関係していると考えられます。もともとUWPのアプリケーションはフォーム一枚のみで動作するアプリケーションのため、インスタンスが再度作成されることを考慮していないことが原因と考えられます。

対処法

なし?
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2018-12-10
iPentec all rights reserverd.