24

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

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

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

<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 を追加します。

その後、別の方法として Template コントロールを使用することがわかったので、Control クラスから継承するクラスを作成し、上記の XAML コードをテンプレートとして使用してカスタム コントロールに適用し、すべての残りのロジックはそこにあります。

もちろん、x:Name プロパティをコントロール内のいくつかの UIElements に追加して、UIElements とやり取りできるようにする必要もありますが、おわかりいただけたでしょうか。

これらの 2 つの方法のいずれかを使用してもよいのか、それとも特に 1 つを使用する方がよいのか、またその理由は? また、Designer ウィンドウで UserControls を見ることができるので、UserControls を使用するのが好きです。代わりに、テンプレートではそれを行うことができません。アプリを実行してコントロールのインスタンスを作成し、それが何であるかを確認する必要があります。実際に似ています。

ご協力ありがとうございます。この疑問を持っているのは私だけではないと思います。この質問が他の人にも役立つことを願っています:D

セルジオ

4

2 に答える 2

28

TLDR

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

ユーザーコントロール

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

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

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

カスタム コントロール

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

カスタムパネル

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

于 2015-03-30T05:58:54.460 に答える
3

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

例のように他のコントロールの構成であるコントロールを作成したい場合、ユーザーコントロールは優れていますが、特別な種類のパネルを作成したい場合は、実際にカスタムコントロールを作成する必要があります。

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

于 2015-03-29T20:43:45.467 に答える