2010-12-01 5 views
6

WPF/Silverlight:テンプレートカスタムコントロール部分的に

こんにちはみんなは、

我々はそれ一部-テンプレートを再することができ、後に、このような方法で、私たちのカスタムコントロールを作成することはできますか?手段、ControlTemplate全体を交換せずに、変更/オーバーライドしたいの外観と感触は?

一つの方法は、もちろん、これです:それは見て、部分的に感じ、そして以下に示すように、あなたのXAMLでそれを使用しています修正、generic.xamlからのControlTemplateコードをコピーします。

<MyCustomControl> 
     <MyCustomControl.Template> 
       <ControlTemplate> 

        <!-- paste the copied and modified code from generic.xaml here--> 

       </ControlTemplate> 
     </MyCustomControl.Template> 

     <!--other code--> 

</MyCustomControl> 

しかし、問題このアプローチでは、xamlをにあまりにも冗長にしますです。私は真剣にそれが好きではありません。私は私のカスタムコントロールを使用しているxamlを汚染することから私を救うかもしれないいくつかのソリューションを探しています。

ありがとうございます!

答えて

1

を私はこの結論に至りました。

独自のカスタムコントロールを作成する場合は、コントロールのテンプレートピースを作成または提供する理由をより柔軟にすることができます。たとえば、新しいWPF DataGridコントロールを見ることができます。このコントロールには、コントロールのさまざまな部分をテンプレートする機能があります。他のヘッダー付きコンテンツコントロールでは、コンテンツの別のテンプレートとコントロールのヘッダー部分が存在することがよくあります。

+0

私はそれができる範囲で私の質問に答えると思います。そしてできないことは答えられないので、私はそれを受け入れます! – Nawaz

1

残念ながら、コントロールテンプレートを変更することは、すべてまたは何もない命題です。複雑なコントロールテンプレートを変更すると、XAMLは非常に冗長になります。

1つのアプローチ(とにかく明白です)は、制御可能なテンプレートを使いやすくするために、小さな構成可能な部分からUIを構築することです。

Style.BasedOn Propertyを使用してスタイルを再利用する可能性があります。残念ながら、これはあなたの問題を解決しません。

1

小さな編集を1つ作成すると、デフォルトのコントロールテンプレート全体をコピーして貼り付ける必要があるという同じ問題に直面しています。

ただし、複数のリソースディクショナリを定義し、<ResourceDictionary.MergedDictionaries>を使用して、マークアップとコントロールテンプレートを区切ることができます。

あなたのXAMLマークアップは非常にきれいにし、次のようなものになります。私はマーティンがControlTemplatesはかなりオール・オア・ナッシングの事WPFで、私はかなり自分自身を失望されたことについて言っていることのほとんどに同意

<Style> 
     <Setter Property="Template" Value="{StaticResource SomeRandomTemplate}" /> 
</Style> 
関連する問題