2009-09-29 15 views
14

トグルボタンから拡張されたシンプルなカスタムコントロールを作成しています。これにより、ユーザーはXAMLで直接チェックされたコンテンツと未チェックのコンテンツを指定できます。それはうまく動作しますが、それはトリガに基づいており、スタイル以外のトリガを定義する方法はわかりません。スタイルを定義すると、カスタムコントロールの外にあるものはすべて失われます。既存のスタイルをオーバーライドせずにWPFカスタムコントロールにトリガーを追加する方法?

私ができることを望むのは、コントロール上の他の場所に設定されている既存のスタイルにこのトリガーを追加するだけです。

ここにスタイル/トリガーのXAMLがあります。

<ToggleButton.Style> 
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
     <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" /> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content" 
         Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ToggleButton.Style> 

私は、デフォルトのタイプでBASEDON経由スタイルを継承しようとしたが、カスタムコントロールが親によって設定された明示的なスタイルを持っている場合、それは動作しません。私はEventTriggersも考慮しましたが、コントロールを初期化するイベントはないと思います。

誰もが提供できるお手伝いをありがとう。 :)

答えて

17

ここでは、用語を明確にするために:ユーザーコントロールは、UserControlクラスから派生したコントロールです。あなたが理解していれば、ToggleButtonから派生してUncheckedContentとCheckedContentの各プロパティを追加することができます。その場合、カスタムコントロールを登録しておきます。一般的な用語に同意すると常に従うほうが簡単です:)

XAMLでこのような一般的なスタイル継承を行うことはできません。別のスタイルがどのスタイルに基づいているかは、常に明示的に指定する必要があります。あなたのスタイルは、ToggleButtonのデフォルトのスタイルに基づいても、特定の他のスタイルに基づいてもかまいません。あなたがそれを尊重するスタイル継承連鎖を構築できない場合、このアプローチはうまくいかないでしょう。

しかし、あなたはカスタムコントロールを持っているので、このようなデフォルトのトグルボタンスタイルに基づいたデフォルトのスタイルを書くことができませんでしたか?

<Style TargetType="{x:Type CustomToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 

あなたはトグルボタンに明示的なスタイルを適用するたびに、あなたはそれがデフォルトのトグルボタンのスタイルに基づいていることを指定します。

また、上記のトリガを含むThemes \ Generic.xamlに新しいトグルボタン用の(デフォルトの)コントロールテンプレートを書くことができます。ブレンドでは、トグルボタンのデフォルトテンプレート( "テンプレートの編集" - > "コピーの編集")のコピーを取得できるので、トグルボタンが通常のトグルボタンとまったく同じように見えるようにすることができます。次に、上記のトリガーをそのテンプレートに組み込みます。

ところで、新しいプロパティを追加するだけで新しいコントロールを作成する必要はありません。 attached propertiesを使用して、既存のコントロールに新しいプロパティを追加できます。これらは、通常のプロパティと同様にXAMLから使用できます。

+0

入力いただきありがとうございました。私は少し違ったルートを行って、既存のスタイルをコードの背後に拡張して、既存のスタイルを破棄せずにトリガーを追加しました。あなたが作ったBasedOnの提案は、すでに試していたし、明示的なスタイルが設定されていればうまくいきません。私はあなたのアイデアからそこに着いたので、答えとしてマークしています。 添付のプロパティのアイデアは本当に良かったし、私もその変更を加えました、ありがとうございます。 :) –

+1

あなたがしたことの詳細を投稿してもよろしいですか?私は同じことをしたいと思います。 – stone

+0

これはちょうど私に多くのコードを保存しました。ありがとう! – MattS423

関連する問題