XtraLayoutControl 14.1.5のテンプレート

WinFormsアプリケーションでユーザーインターフェイスを作成する場合、開発者は面倒な繰り返し作業を行う必要があります。 以下に示すユーザーインターフェースフラグメントに世界中でどれだけの工数が費やされているか想像するのは怖いです。 節約した時間は、例えば海で、大切な人と過ごすことができます...



住所を編集するためのフォーム。





ログインフォーム。



この記事では、ユーザーインターフェイス要素を再利用するという問題を解決するための既存のアプローチを検討し、別の要素を提案し、どの方法が優れているかを説明します。 この記事は、コントロールのラインに精通したWinForms開発者を対象としています。





UI要素を再利用するための最も単純で最も普遍的な、しかし視覚的でないソリューションは、コードからそれらを生成することです。 このアプローチの欠点は明らかです-結果を視覚的に編集することは不可能です。 この欠陥は、適切なコントロールの使用を補うことができます。 たとえば、 XAFダッシュボードはデフォルトでXtraLayoutControlを使用してメタデータからシンプルなUIを生成します。ユーザーは後でランタイムで変更できます。 ユーザーの変更はXMLファイルに保存され、UIを生成するたびに、このファイルからの読み込みが行われます。 さらに、ランタイムのカスタマイズとXMLでのレイアウトのロード/保存は、XtraLayoutControlの組み込み機能です。

使いやすいインターフェイス要素を作成するために著者に知られている最初の視覚的なソリューションは、Delphiのフォームの視覚的継承機能でした。 少し後、この機能はVisual Studioに登場しましたが、まだ実装が不十分であり、少なくともボタンよりも少し複雑なコンポーネント開発者にとっては頭痛の種です。 Visual Inheritanceは使用しないでください。 代わりに、ユーザーインターフェイスを個別のUserControlに分割するとうまく機能します。 たとえば、チェックアウトフォームはHeaderUserControl、AddressUserControl、OkCancelButtonsUserControlに分割でき、プロジェクトのフォームで必要なだけ使用できます。 これは良い方法ですが、欠陥がないわけではありません。 UserControlは、作成されたプロジェクトでのみToolbox Studioに表示されます。 UserControlを変更すると、使用された場所に変更が適用されますが、これは常に良いとは限りません。 このような分割は、アプリケーションのレイアウトにも複雑さを追加しますが、XtraLayoutControlを使用し、大きなフォームを分割する場合、UserControlではなくDXバージョンのXtraUserControlを作成すれば、レイアウトに問題はありません。 バージョン14.1では、このユースケースを改善するために真剣に取り組みました。XtraUserControlは、その子のMinimumSizeとMaximumSizeを上位レベルに変換できます。

最後に、再利用可能なUIの実装に対する提案されたアプローチについて説明しましょう。 XtraLayoutControlで標準テンプレートを操作する独自のメカニズムを作成しました







スタジオデザイナーでXtraLayoutControl CustomizationFormを開き、[テンプレートの表示]ボックスをオンにすると、定義済みのテンプレートが[非表示のアイテム]リストに表示されます。 この実験的な機能は、本日リリースするバージョン14.1.5で使用可能になります。 一部の要素を設計する準備ができていないため、独自のテンプレートを作成する機能を無効にしましたが、この機能が次のアップデートで利用できることを願っています。

テンプレートには、選択したコントロールに関連するInitializeComponentのフラグメントであるDesignSurfaceのテンプレートからコントロールをスローするときにプロジェクトに追加する必要があるコントロールのタイプに関する情報が含まれています。 そのようなフラグメントの例を以下に示します。



public class textEdit1 : DevExpress.XtraEditors.TextEdit { public void InitializeInstance(DevExpress.XtraEditors.TextEdit target) { ((System.ComponentModel.ISupportInitialize)(target.Properties)).BeginInit(); target.Location = new System.Drawing.Point(0, 0); target.Name = "textEdit1"; target.Size = new System.Drawing.Size(100, 20); target.TabIndex = 4; ((System.ComponentModel.ISupportInitialize)(target.Properties)).EndInit(); } }
      
      







テンプレートをスローすると、次のシーケンスが得られます。

-プロジェクトに依存アセンブリを追加する

-テンプレートで指定されたタイプに従ってコントロールのインスタンスを作成します。

-初期化メソッドを含む一時アセンブリをコンパイルします。

-ビルド時からメソッドによってコントロールの初期化を呼び出します。

-DesignSurfaceに初期化されたコントロールを追加します。



説明されている手順の最大の問題は、コンポーネント間の関係です。 たとえば、ユーザーはXtraGridControlの便利なデフォルト値をカスタマイズしました。 グリッドにDataSourceが設定されている場合、初期化メソッドにはgrid.DataSource = bindingSource1という行があります。 テンプレートにはbindingSource1がなく、この行は初期化エラーをスローします。 残念ながら、テンプレート内の外部接続を正しくクリーンアップするヒューリスティックをまだ発見できていません。 この場合、テンプレートの作成段階でエラーが発生する可能性が高くなります。



そのため、14.1.5のユーザーの武器庫から、ユーザーインターフェイスの断片を再利用する視覚的な方法がもう1つあります。テンプレートです。 どのような状況で彼は好まれるべきですか?

-テンプレートは、作成されたプロジェクトだけでなく、すべてのプロジェクトから利用できます。主なことは、.NETはテンプレートの初期化時にテンプレートに必要なすべてのアセンブリを見つけることができるということです。

-複数のコントロールのために、プロジェクトに個別のUserControlを作成することは必ずしも便利ではありません。

-使用されるすべての場所でUserControlの変更を適用することは必ずしも望ましいことではありません;テンプレートは、フォーム上で直接変更しやすいコントロールの独立したコピーを作成します。 おそらく、ここでスニペットでテンプレートの類似性を描くのが適切です。 .NET言語には、コードの重複を避けるための多くの方法が用意されていますが、それにもかかわらず、スタジオにはスニペットがあります。



All Articles