2017-12-16 8 views
2

私のUWPアプリケーションでは、私のコントロールオプションはユーザーコントロールとテンプレートコントロールです。この時点で私のユーザーコントロールの理解は明確です。テンプレートコントロールとUWPのカスタムコントロール明確な答えがオンラインで見つかりませんでした

カスタムコントロールのスタイル/テンプレートはメモリ内で一度しかインスタンス化されておらず、コントロールが最初に使用されたときにのみ発生すると言われました。これは、私が作成しているコントロールがListViewで使用されることを知っているからです。

しかし、XAML Unleashedの著者は、ユーザーコントロールで始まり、基本クラスを変更するだけでカスタムコントロールを作成します。事は彼が作成したコントロールがInitializeComponent()を呼び出すことです。私は、このタイプのクラスはListViewの各項目に再登録されているので、より多くのメモリを使用すると聞いています。

また、カスタムコントロールがInitializeComponent()メソッドを使用しているとは思わなかった。コンストラクタにthis.DefaultStyleKey = typeof(MyClass);の呼び出しがあったと思いました。何がありますか?私は何が何であるか混乱しています...

最後に、テンプレートコントロールのスタイル/テンプレートは、独自の別ファイル(xamlファイルとコード)ではなく、グローバルGeneric.xamlファイルに配置されています-behindファイルのペア)?コントロールがカスタムで「ポータブル」であると想定されている場合、それは他のコードから完全に分離されるべきではありませんか?私は一つの記事でこれらのことのいずれかを詳細に説明しているわけではありません。

答えて

2

これはほとんどの人が間違っていることですので、私はあなたのためにいくつかを明確にしようとします。

メモリ

メモリ全体の事、それはすべてのビジュアルツリーにあります。テンプレートまたはUserControlのいずれかのコントロールをインスタンス化すると、テンプレート内にビジュアルコンポーネントの完全なコピーを作成するため、すべてのインスタンスでメモリを使い果たします。

テンプレートコントロールでは、からコピーが作成され、UserControlは、InitializeComponent()が呼び出されたときにXAMLファイルを解析します。

コンテンツが同じ場合、100個のテンプレートコントロールまたは100個のユーザーコントロールを作成すると、メモリ使用量は同じになります。

使用

を鋳型コントロールがButtonSliderMyStarRatingInput、などのようなあなたは、単一のコンポーネントを作成している状況で、のために最高であり、あなたが交換する能力があなたのコントロールのユーザーを与えています独自のテンプレートを使用します。ロジックはテンプレートに依存せず、テンプレートは視覚的な状態の変化に対して適切に反応する必要があるため、UserControlsより適切にこれを行うにはさらに多くの努力が必要です。

UserControlは、フォーム、ポップアップ、スクリーン、ページなどのレイアウトやビューに最適です。誰かにあなたのビューの内容を改ざんすることは自由です。小さなビューで再利用できるビューがいくつかある場合は、いくつかのpublic/dependencyプロパティを公開することができますが、一般的にはそれらは石で設定されています。

Generic.xaml

私は正直、このための答えを持っていません。マイクロソフトでは、複数のリソースディクショナリを使用して、コントロールテンプレートのよりクリーンなパーティショニングを可能にする必要がありました。Generic.xamlは、プロジェクトを参照するコントロールの基本スタイルのルートソースとして検索される予約されたファイル名です。 Generic.xamlから他のXAMLファイルを参照することもできますが、それは煩わしく、リソースディクショナリのルートが肥大化します。今のところ、あなたはこの方法に悩まされています。

勧告

あなたがコントロールライブラリを共有している場合は、可能な限りテンプレートのコントロールを使用するとよいでしょう。現在のプロジェクトのコントロール、ビュー、ページなどをビルドしていて再利用を目的としていない場合は、UserControlsを使用してください。

テンプレートを所有し、すべてのユーザーがデザインを受け入れる予定の場合は、コントロールライブラリにUserControlを作成することはできます。

また、ListViewのように、単一のビューで100回インスタンス化する予定のアイテムにテンプレートコントロールを使用することをおすすめします。すべてのインスタンスでXAMLファイルを解析するのではなく、テンプレートがメモリにプリロードされていれば、速度が大幅に向上します。

+0

generic.xamlの回答を追加しました – Laith

関連する問題