0

カスタムUIを追加するための最良の方法を見つけようとしています(意図的にカスタムコントロールとは呼びたくありません)。カスタムコントロールを作成したいのですが、テンプレート化する必要はありません。他のコントロールを使用して視覚的に実装したいと思います。私の例では、実装にPathオブジェクトを使用するコントロールを作成しようとしています。作成時にパスコントロールをビジュアルツリーに「追加」したかったのです。いくつかの依存関係プロパティを公開し、依存関係プロパティが変更されたときにPathオブジェクトを更新するようにします。

私の最初のアプローチは、Controlから継承し、パス「Part」を定義し、「OnApplyTemplate」ルーチンで見つけて、必要に応じて更新することでしたが、それは非常にやり過ぎのようです。私が実装するコントロールには、別のコントロールテンプレートを取得する機能がありますが、機能はその中の単一のパスオブジェクトを想定する必要があり、このパスのほとんどのプロパティをオーバーライドするため、まったく役に立ちません。また、Background、BorderBrush、BorderThicknessなど、必要のない多くのプロパティも公開します。これらはすべて使用せず、公開する他のプロパティから計算します。

したがって、問題は、代わりにFrameworkElementから継承する必要があるかどうかです。継承する場合、新しいカスタムコントロールを実装するために使用するPathオブジェクトを「植える」にはどうすればよいですか。

4

1 に答える 1

0

MSDNが言うように:

FrameworkElementUI表現を目的としたクラスに期待される特定のサービス(テンプレートサポートなど)がそのレベルで完全に実装されていないため、直接派生することは一般的ではありません。

..。

FrameworkElementいくつかの基本的なシナリオのサポートを提供しますが、XAMLでUIを作成するために使用するビルディングブロックという意味での「UI要素」に望ましい多くの機能も欠いています。これらの機能の多くは、代わりControlに、、またはのその他の直接のサブクラスに実装されFrameworkElementます。

Silverlightライブラリの逆コンパイルは、に何も「描画」できないことも示唆していますFrameworkElement。その子孫の場合は、1つを使用する必要があります。WPFで可能なことは、Silverlightで、特にコアレベルで常に可能であるとは限りません。

Control私は子孫に固執します。クラス定義にを適用して、オブジェクトTemplatePartAttributeが必要であることを指定します。Path

[TemplatePart(Name="ThePath", Type=typeof(Path))]
public class MyControl { ... }

次にOnApplyTemplate、新しいテンプレートにパスがあることを確認します。このようにして、テンプレートにPath複数ある場合にどちらを使用するかがわかります。Path

このアプローチには1つの重要な利点があります。誰か(またはあなたでさえ)がロジックを変更せずにコントロールの外観に何かを追加したい場合、それは単に新しいテンプレートを定義することによって行われます。たとえば、Pathをボックスで囲むテンプレートは次のとおりです。

<ControlTemplate TargetType="MyControl">
  <Border BorderThickness="{TemplateBinding Control.BorderThickness}"
          BorderBrush="{TemplateBinding Control.BorderBrush}"
          Background="{TemplateBinding Control.Background}">
    <Path Name="ThePath" Stroke="{TemplateBinding Control.Foreground}"
          StrokeThickness="1.5"/>
  </Border>
</ControlTemplate>

公開されたプロパティについては、少なくともデフォルトの動作には、最も関連性の高い継承されたプロパティを使用するようにしてください。

于 2012-04-17T04:01:51.130 に答える