2011-07-26 8 views
3

は、私はこのようなカスタムコントロールを持っている:Foregroundプロパティ行動の混乱

public class CustomControl1 : Control 
{ 
    private StackPanel panel; 

    static CustomControl1() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1))); 
    } 

    public override void OnApplyTemplate() 
    { 
     panel = (StackPanel)GetTemplateChild("root"); 
     panel.Children.Add(new TextBlock { Text = "TextBlock added in the OnApplyTemplate method" }); 

     base.OnApplyTemplate(); 
    } 
} 

及びその制御テンプレートは、このようなものです:

<Style TargetType="{x:Type local:CustomControl1}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
       <StackPanel Name="root"> 
        <TextBlock>TextBlock added in ControlTemplate</TextBlock> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

その後、私は、メインウィンドウでそれを使用します。

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:app1="clr-namespace:WpfApplication1"> 
<Grid> 
    <Grid.Resources> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Foreground" Value="Green"></Setter> 
     </Style> 
    </Grid.Resources> 

    <app1:CustomControl1 Foreground="Red"> 

    </app1:CustomControl1> 
</Grid> 

if

enter image description here

だから私の混乱がControlTemplateの中のTextBlockは、フォアグラウンドのローカル値を以下のことです:私は、それはこのようになるだろう、それを実行します。しかし、OnApplyTemplateメソッドに追加されたTextBlockはスタイルの値に従います。

しかし、私がしたいのは、ローカル値が存在しない場合にのみスタイルに従うTextBlockです。

なぜ、2つのTextBlocksの動作が異なっているのですか?また、ローカル値が存在しない場合にのみスタイルに従うTextBlockを取得するにはどうすればよいですか?

注:どのように私は ( は、カスタムコントロールを含む)グリッドのリソースの暗黙的なスタイルの影響を受けていないカスタムコントロールの内部のテキストブロックを作ることができます。

答えて

2

あなたがForegroundのためのローカル値を適用すると、あなたのスタイルであなたは違いの多くを作ることだけTextBlockに適用されているのに対し、CustomControlに適用されます。 Grid.Resourcesを取り除き、スタイルセッターを直接ControlTemplateに移動すると、期待通りに動作します。

<Style TargetType="{x:Type local:CustomControl1}"> 
    <Setter Property="Foreground" Value="Green"></Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
       <StackPanel Name="root"> 
        <TextBlock>TextBlock added in ControlTemplate</TextBlock> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

ありがとう、これは問題を解決する1つの方法です。しかし、私はローカル値が存在しないときにスタイル(Grid.Resourcesで定義されている)に従うだけのカスタムコントロールを取得したかったのです。 – CuiPengFei

+0

'Grid.Resources'のあなたのスタイルは、' TextControl1'のもので 'TextBlock'のものではありません。 "' – anivas

+0

本当にありがとうございます。異なって振る舞う。私は、テキストブロックのスタイルが存在するときに中断されないカスタムコントロールが必要です。 – CuiPengFei