2016-10-19 20 views
1

以下のxamlに基づいて、2つ(またはそれ以上)のボタン(暗黙的なスタイル)を作成すると、実際にそのうちの1つだけが実際にコンテンツを表示します。背後にあるコードをチェックボタンの内容が常に表示されない

<Style TargetType="Button"> 

    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
     <Border BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="1"> 
      <ContentPresenter Content="{TemplateBinding Content}"/> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 

    <Setter Property="BorderBrush" Value="Blue"/> 

    <Setter Property="Content"> 
    <Setter.Value> 
     <Grid Background="Firebrick"/> 
    </Setter.Value> 
    </Setter> 

</Style> 

、すべての3つのボタンがまったく同じ内容を持って、まだそれが唯一のこれまでそれらの1

if (a.Style == b.Style && a.Style == c.Style) 
{ 
    if (a.Content == b.Content && a.Content == c.Content) 
    { 
     // comes in here! 
    } 
} 

enter image description here

+2

すべての3つのボタンはまったく同じ内容を持っているが、UIElementのは、複数の親に属しているので、ボタンの最後に表示することはできません。グリッドをテンプレートの一部にすることを検討してください – ASh

+2

[ContentPresenter](https://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(英語)のRemarksセクションの第4の箇条書きを参照してください。 = vs.110).aspx)MSDNのページ:* ContentがUIElementオブジェクトの場合、UIElementが表示されます。 UIElementに既に親がある場合、例外が発生します*。しかし、明らかに例外は発生しないか、内部的にキャッチされます。 – Clemens

+0

非常にイライラしていて、これは問題だったかもしれないと思っていましたが、例外が発生しないので私を混乱させました。 –

答えて

1

問題は、1人の以上の親を持つことができない内容でグリッドです。

回避策は、DataTemplateを使用し、DataTemplateとして要素のContentTemplateを設定することです(以下のスレッドで説明します)。

Set a Button's content in style

0

に表示されている私はすでにボタンで、この問題に直面して画像。これは、プロパティではなく、Contentプロパティを定義したスタイルにリンクしています。 Contentプロパティを設定すると、何かへの参照を定義したり、WPFにアイテムごとに新しいオブジェクトを作成するよう依頼したりせず、スタイルでレンダリングされた最後の要素のみがContentになります。

だから、すべてのボタンにコンテンツを設定する予定がある場合は、ContentTemplateプロパティを設定します。実際にButtonのアスペクトのみを変更する場合は、Templateプロパティを設定します。 Templateプロパティを持つ例えば

:クレメンスと灰で述べたように

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
      <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"> 
       <ContentPresenter Content="{TemplateBinding Content}" /> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

<Setter Property="BorderBrush" Value="Blue" /> 

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Grid Background="Firebrick" /> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

関連する問題