web-dev-qa-db-ja.com

UserControlに対してテンプレート化されたコントロールを使用するのはいつですか?

WinRTでカスタムコントロールを作成する方法についていくつかのチュートリアルを探していましたが、質問があります。

左側に画像があり、右側にいくつかのTextBlockがあるグリッドなど、いくつかのものを含む単純なコントロールを作成するとします。

つまり、次のような単純なものです。

<Grid Height="100">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.3*"/>
        <ColumnDefinition Width="0.7*"/>
    </Grid.ColumnDefinitions>
    <Image Source"/Assets/someRandomImage.png"/>
    <StackPanel Grid.Column="1"
                VerticalAlignment="Center">
        <TextBlock Text="Some text"
                   Margin="10,0,10,0"
                   FontSize="24"
                   FontWeight="SemiLight"
                   TextTrimming="CharacterEllipsis"/>
        <TextBlock Text="Some random description..."
                   Margin="10,5,10,0"
                   FontSize="18"
                   FontWeight="Light"
                   Foreground="Gray"
                   TextWrapping="Wrap"
                   TextTrimming="CharacterEllipsis"/>
    </StackPanel>
</Grid>

このコンテンツを使用してUserControlを作成するので、UIの作業中にXAMLデザイナで表示でき、UserControlコードの背後にあるすべてのプロパティとDependencyPropertiesを追加します。

次に、別のアプローチがテンプレートコントロールを使用することであることがわかりました。そのため、コントロールクラスから継承するクラスを作成し、上記のXAMLコードをテンプレートとして使用して、カスタムコントロールに適用し、すべてを追加する必要があります。残りのロジックはそこにあります。

もちろん、x:Nameプロパティをコントロール内のいくつかのUIElementに追加して、それらと対話できるようにする必要もありますが、あなたはその考えを理解しています。

私は疑問に思っていました、これらの2つの方法のいずれかを使用しても大丈夫ですか、それとも特に1つを使用する方が良いですか、そしてなぜですか?また、デザイナーウィンドウに表示されるので、UserControlsを使用するのが好きです。代わりに、テンプレートではそれを実行できません。アプリを実行し、コントロールのインスタンスを作成して、それが何であるかを確認する必要があります。実際にはのように見えます。

あなたの助けに感謝します、私はこの疑いを持っているのは私だけではないと思います、それで私はこの質問が他の人にも役立つことを願っています:D

セルジオ

21
Sergio0694

[〜#〜] tldr [〜#〜]

カスタム(テンプレート化された)コントロールを使用すると、アプリはTemplateプロパティを使用して、コントロールの内部要素ツリーを置き換えることができます。コントロールにその再テンプレート機能が必要ない/必要ない場合は、UserControlを使用する方が簡単です。

serControl

  • UserControlは、Visual StudioまたはBlendを使用して作成する方がはるかに簡単で、適切なデザインビューをサポートします。
  • 通常、これを使用して、複数のコントロールからアプリのビューを作成します。
  • フルスクリーンビューまたはフルウィンドウビューの場合、または複雑なビューがあり、より小さな、場合によっては再利用可能なコードチャンクに分割したい場合に最適です。
  • このようなビューは、MVVMパターンを採用することを選択した場合、対応するビューモデルで裏付けられることがよくあります。

  • UserControlの問題の1つは、アプリ内の複数の場所で再利用できる一方で、アプリ内のさまざまな場所での外観や動作を微調整することが難しいことです。テンプレートとUIツリーがコンストラクターにロードされます。

  • 通常、単一のアプリの範囲内でのみ再利用できます。

カスタムコントロール

  • A custom controlまたは場合によってはtemplated controlは、単一の目的を果たすUIの小さなチャンクに最適です。つまり、単一の特定のタイプの情報を視覚化します。
  • テンプレート化されたコントロールでは、特定のユースケースに合わせてビジュアルを調整するためにテンプレートを変更できます。これにより、あるアプリではデフォルトのボタンのように見えるボタン、別のアプリでは丸みを帯びたボタン、さらに別のアプリでは画像のみで構成されたボタンを使用できます。それはそれをより再利用可能にします、それはあなたが複数のアプリを作るか、あなたの素晴らしいコントロールを世界と共有したいなら理にかなっています。
  • 適切に記述されたカスタムコントロールは、特定のアプリのビジネスロジックに依存しないため、通常、複数のアプリで再利用できます。
  • これは通常、ButtonToggleButtonContentControlSliderTextBoxListViewロジックを追加またはオーバーライドします。ただし、最初から作成することが理にかなっている場合は、「実質的に抽象」ControlItemsControlRangeBaseShape、さらにはFrameworkElement(最後の2つはテンプレート化されていません)。
  • テンプレート化されたコントロールのビジュアルツリーは、テンプレートが読み込まれるときに読み込まれます。これは、コントロールの可視性が最初にCollapsedからVisibleに変更されたときに発生する可能性があります。これにより、UIの一部の読み込みを延期できます。パフォーマンスを向上させるため。
  • コントロールテンプレートは1回しか読み込まれないため、ItemsControl DataTemplate(リスト、グリッドビューなど)内での使用に最適です。 UserControlを使用する場合、UserControl XAMLが何度も解析されるため、パフォーマンスが大幅に低下する可能性があります。

カスタムパネル

A custom panelは、子のレイアウト方法をカスタマイズできるもう1つのタイプのUI要素です。

26
Filip Skakun

ユーザーコントロールの作成は、カスタムコントロールの作成よりもはるかに簡単です。手始めに、ユーザーコントロールにはデザイナーサポートがあります。ユーザーコントロールの欠点は、カスタムコントロールと比較して制限されていることです。

ユーザーコントロールは、例のように他のコントロールを組み合わせたコントロールを作成したいが、特別な種類のパネルを作成したい場合は、実際にカスタムコントロールを作成する必要がある場合に最適です。

したがって、要約すると、「単純な」コントロールのユーザーコントロールは、複雑なコントロールのユーザーコントロールです。ユーザーコントロールはカスタムコントロールで作成できますが、その逆はできません。

3
Philip Stuyck