2011-07-26 93 views
3

我有一個這樣的自定義控件:前景財產行爲混亂

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

所以我的困惑是,在控件模板中的TextBlock如下前景的局部值。但在OnApplyTemplate方法中添加的TextBlock遵循樣式中的值。

但我想要的是一個TextBlock,只有當沒有本地值存在時才遵循樣式。

那麼,爲什麼兩個TextBlocks的行爲不同,我怎樣才能得到一個TextBlock,只有在沒有本地值的情況下才符合樣式?

注:我怎樣才能使電網的資源(其中 包含自定義控制)受隱式風格的自定義控制不 的內部的TextBlocks。

回答

2

當您申請Foreground你申請到CustomControl,而在風格你只適用於TextBlock,使得很多差的局部值。擺脫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

謝謝,這是解決問題的一種方法。但是我想在不存在本地值的情況下獲得只遵循樣式(在Grid.Resources中定義)的自定義控件。 – CuiPengFei

+0

然後你在'Grid.Resources'中的風格應該是'CustomControl1'而不是'TextBlock'。 '' – anivas

+0

'謝謝,但我真正的問題是,我想知道爲什麼兩個TextBlocks行爲有所不同。我想要一個自定義控件,當文本塊的樣式出現時不會被打斷。 – CuiPengFei