このトピックでは、Windows Forms プラットフォーム向けに作成された .NET Framework アプリケーションを WPF プラットフォームアプリケーションへと移行する案件において、FlexGrid for WinForms を使用して設定された機能を FlexGrid for WPF に置き換える際に問題となる、動作の違いやその解決方法について紹介します。
WinForms 版および WPF 版の FlexGrid は、多彩な表現力と柔軟性を兼ね備えるグリッドコンポーネントという同一コンセプトの下で開発されており、WPF 版は WinForms 版の主要な概念や機能を相互に継承しています。異なるプラットフォーム間での移行において、FlexGrid が提供する機能の多くは、移行先においても引き続き利用することができます。
一方で、WinForms 版と WPF 版は対象プラットフォーム上で最大のパフォーマンスを発揮するようチューニングされており、同一機能であってもプラットフォームに依存した実装が行われているため、メンバーレベルでの 100% 互換が保たれているわけではありません。特定の機能を使用した一部処理においては、その違いを考慮し適切な実装方法に置き換える必要があります。
ターゲットプラットフォーム
WinForms 版と WPF 版には、機能名レベルで同じものが数多く存在します。しかし、それぞれターゲットとなるプラットフォームの特性に合わせ、すべてのメンバーの型や動作が調整されています。例えばキーボードおよびマウス関連イベントはプラットフォームの標準仕様に準拠しており、WinForms 版と WPF 版では、その発生タイミングやイベント引数のオブジェクト構造などは異なっています。
データ接続
それぞれ、対応するプラットフォームにおける標準的なデータ接続メカニズムに準拠しており、接続方法が異なります。WinForms 版では、ADO.NET データソースオブジェクト(DataTable、DataView、DataSet、DataViewManager など)をサポートしており、C1FlexGrid.DataSource プロパティにデータソースオブジェクトを設定します。WPF 版では、IEnumerable インタフェースもしくは ICollectionView インタフェースを実装するオブジェクトをデータソースとして利用でき、C1FlexGrid.ItemsSource プロパティや Column.Binding プロパティを使用してバインディングに関する設定を行って接続します。
グループ化とフィルタリング
グループ化とフィルタリング操作は、両方の製品で行うことが可能です。ただし、WinForms 版ではそのための組み込み UI が用意されていますが、WPF 版ではこれらの機能がそれぞれ拡張クラスとして提供されます。これらを使用する場合は、それぞれ対応するアセンブリへの参照設定を追加し、拡張クラスと C1FlexGrid を連動させる必要があります。
カスタムセルの実装
それぞれ、セルの外観や編集時エディタをカスタマイズした独自のカスタムセルを実装する方法が用意されています。WinForms 版では OwnerDrawCell イベントによるオーナー描画と、IC1EmbeddedEdit インタフェースを実装することによるカスタムエディターが利用できます。一方、WPF 版ではテンプレートを使用した XAML でのカスタムセルのほか、CellFactory クラスを使用したコードでのカスタムセルが利用可能です。
WinForms 版と WPF 版の FlexGrid には、互換性がありません。WinForms 版 FlexGrid を用いて作成した WinForms プロジェクトを WPF プロジェクトに移行するには、以下で紹介する資料などをご参考いただき、それぞれ対応するメンバーや代替手段に置き換える必要があります。
メンバー比較表
FlexGrid の WinForms 版と WPF 版の主な機能に対するメンバー比較表を別資料にまとめております。それぞれ対応するメンバー、および代替機能の詳細についてはこちらをご参考ください。
サンプルプロジェクト
両製品の各機能について、実装方法の違いをコードでご確認いただくためのサンプルを用意しています。違いを把握しやすいように1画面に WinForms 版と WPF 版の C1FlexGrid コントロールを配置し、同じ機能を実装しています。また Visual Studio を起動しなくてもサンプル実行時にソースコードを確認することもできます。
プロジェクトファイル一式をダウンロードする(517 KB)
※ このサンプルはWPFの開発経験が豊富なエスビーエス株式会社が作成しています。
[システム要件]
- ComponentOne for WinForms
- ComponentOne for WPF
- Visual Studio(2019 以降)
Windows Forms 開発経験者のための WPF 開発技術資料
この資料は Windows Forms の開発経験はあるものの、WPF 開発経験の浅い開発者に対して、開発を進める際に気を付けるべきポイントをまとめた資料になります。
Windows Forms 開発経験者のための WPF 開発のポイント集
※ この資料は、WPFの開発経験が豊富なエスビーエス株式会社が社内で活用している資料を特別に公開したものです。開発現場の生の声としてお役立てください。
弊社テクニカルサポートに寄せられたお問い合わせのうち、移行に関して多く寄せられるご質問について紹介いたします。
技術的な質問
Q1. WinForms 版 FlexGrid 用に作成した初期化処理や実装コードなどは、WPF 版 FlexGrid でそのまま利用できますか?
A1. FlexGrid の WinForms 版と WPF 版では、対象プラットフォームの違いなどもあり、メンバー構成が一部異なります。そのため、WinForms 版の FlexGrid を対象としたコードは、そのままでは WPF 版 FlexGrid ではご利用いただけません。本資料末尾にあるメンバー比較表やサンプルプロジェクトをご参考いただき、適切な形式でコードを修正いただく必要がございます。
Q2. WinForms 版 FlexGrid にて保存したグリッドデータを、WPF 版 FlexGrid で利用することはできますか?
A2. WinForms 版と WPF 版の FlexGrid 間で、グリッドデータの互換はございません。
Q3. WinForms 版 FlexGrid を用いて作成した WinForms プロジェクトを、WPF プロジェクトに変換するツールはありますか?
A3. WinForms プロジェクトを WPF プロジェクトへ変換するためのツール類は用意されておりません。本製品に付属のプロジェクト移行ツールは、同一プラットフォーム間でのプロジェクトの移行(アップグレード)を目的としており、異なるプラットフォームへのプロジェクトの変換を行うことはできません。
運用およびライセンスに関する質問
Q1. WinForms から WPF へ移行する際、手持ちの WinForms の開発ライセンスで WPF 版アセンブリを使用した開発を行うことはできますか?
A1. ComponentOne for WPF の各アセンブリをご利用いただくには、WPF 版あるいは Enterprise 版の開発ライセンスが必要となります。WinForms 版の開発ライセンスにて WPF 版アセンブリを使用した開発を行うことはできません。
Q2. WinForms 版と WPF 版で、それぞれ異なるリリースバージョンを同一環境に共存できますか?
A2. WinForms 版と WPF 版のアセンブリ間においてはお互いに干渉しないものの、プロジェクト移行ツールやレポートデザイナなどの各種ツール類は各プラットフォーム間で共通で利用されており、製品アセンブリの特定バージョンに依存している場合がございます。バージョンの異なる複数のエディションを一つの環境にインストールすると、共通のツールが上書きされたり、適切なバージョンのツールを使用できないなどの問題が発生するため、同一環境への共存はお勧めできません。
なお、リリースバージョンが同じ WinForms 版と WPF 版のアセンブリについては、同一環境にインストールしてご利用いただくことが可能です。
関連トピック