.NET 8でMultiRowのテンプレートデザイナを使用する

.NET 6および8でのWindows Formsデザイナへの対応については、以下の記事で紹介したように、一部動作しない機能が存在していましたが、現在は開発が進みほとんどの機能が動作するようになっています。

しかし、「MultiRow(マルチロウ)」のテンプレートデザイナについては未だに.NET 6および8では動作しません。そこで本記事では、.NET 8の環境においてMultiRowのテンプレートデザイナを利用する方法について確認します。

.NET 8で新規プロジェクト作成、パッケージ追加

.NET 8でWindows Formsプロジェクトを作成し、MultiRow for WindowsForms 12.0JのNuGetパッケージをインストールします。

.NET 8で新規プロジェクト作成、パッケージ追加

ここで一度、テンプレートデザイナで発生する問題を確認します。フォームにMultiRowのコントロール「GcMultiRow」を配置して、コントロールのスマートタグからテンプレートの追加を試みてもできない状態になっています。

.NET 8で新規プロジェクト作成、パッケージ追加

対処方法

この問題の対処方法としては、.NET Frameworkのプロジェクトではテンプレートデザイナが利用できるので、こちらのテンプレートデザイナを用いてテンプレートを作成し、完成したテンプレートを .NETのプロジェクトで読み込むという方法になります。

先ほど作成した .NETプロジェクトに対して .NET Frameworkのプロジェクトを追加します。

対処方法

.NET Frameworkのプロジェクトでは、フォームにMultiRowのコントロール「GcMultiRow」を配置した場合、コントロールのスマートタグが正しく表示されることを確認できます。

対処方法

.NET Frameworkのプロジェクトでテンプレートを作成

それでは、.NET Frameworkのプロジェクトでテンプレートを作成します。ソリューションエクスプローラーからプロジェクトを右クリックして[追加]-[新しい項目]を選択し、「MultiRow 12.0 テンプレート」を選択します。

テンプレートを作成

テンプレートが作成され、テンプレートデザイナも問題なく表示されます。今回は、InputManCellやPlusPakCellを含む、MultiRowで配置できるコントロールを一通り配置してみます。

テンプレートを作成

.NETのプロジェクトでテンプレートを読み込む

次に、作成したテンプレートを .NETのプロジェクトにて読み込みます。ソリューションエクスプローラーからプロジェクトを右クリックして、[追加]-[既存の項目]を選択して作成したテンプレートを追加します。追加する際に「リンクとして追加」を選択します。

.NETプロジェクトでテンプレートを読み込む

.NETのプロジェクトにリンクファイルとしてテンプレートが追加されます。実際に開くのは .NET Framework側のテンプレートデザイナですが、こちらでテンプレートを確認できるようになります。

.NETプロジェクトでテンプレートを読み込む

テンプレートの変換作業

テンプレートについては一部変換の作業が必要です。PlusPakCellを利用している場合、テンプレートの.resxファイル内にPlusPakのアセンブリ情報が生成されます。PlusPakは、.NETと .NET Frameworkで利用するアセンブリの名前が異なるので、プロジェクトのアセンブリ読み込みの際にGrapeCity.Win.PlusPak.NET.v120.dllをロードするように修正します。

internal static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // 追加処理
        AppDomain.CurrentDomain.AssemblyResolve += (s, a) =>
        {
            var frameworkPPKAssemblyName = "GrapeCity.Win.PlusPak.v120";
            var netPPKAssemblyName = "GrapeCity.Win.PlusPak.NET.v120";
            if (a.Name.Contains(frameworkPPKAssemblyName))
            {
                return Assembly.Load(a.Name.Replace(frameworkPPKAssemblyName, netPPKAssemblyName));
            }

            return null;
        };

        // To customize application configuration such as set high DPI settings or default font,
        // see https://aka.ms/applicationconfiguration.
        ApplicationConfiguration.Initialize();
        Application.Run(new Form1());
    }
}

動作確認

それでは動作を確認します。フォームに配置したGcMultiRowのテンプレートとして、用意したTestTemplateを設定し実行します。

using TemplateProject;

namespace MultiRow_Winforms_Sample;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.gcMultiRow1.Template = new TestTemplate();
    }
}

実行すると、テンプレートがリンクファイルでも問題なく動作することを確認できます。

動作確認

さいごに

今回は .NET 8でMultiRowのテンプレートデザイナを使う方法を確認しました。.NET Frameworkで開発する場合と比べると、テンプレート用のプロジェクト作成やリンクファイルの追加、アセンブリ情報の書き換え、と実装に必要な作業が増えてしまっている状況です。

.NET環境におけるMultiRowのテンプレートデザイナについては、いくつか課題が残っており現時点では提供には至っていません。今後なるべく早期の提供を目指して優先的に取り組んでいきます。

\  この記事をシェアする  /