2011-07-15 51 views
3

我有一个自定义的WPF控件。它有一个嵌套的ContentControl,它绑定到模板的Content属性,因此它可以将任何对象设置为其内容。如果内容是原始字符串,我想将以下样式应用于TextBlock(我知道,如果您将ContentControl的Content属性设置为字符串,则会生成Visual Tree实际呈现带有TextBlock的ContentPresenter时生成的内容)。造型ContentControl

<Style x:Key="Label" TargetType="TextBlock"> 
    <Setter Property="TextWrapping" Value="Wrap" /> 
    <Setter Property="FontSize" Value="14" /> 
    <Setter Property="Foreground"> 
     <Setter.Value> 
      <SolidColorBrush> 
       <SolidColorBrush.Color> 
        <Color A="255" R="82" G="105" B="146" /> 
       </SolidColorBrush.Color> 
      </SolidColorBrush> 
     </Setter.Value> 
    </Setter> 
</Style> 

我还以为要做到这一点是通过嵌套资源的方式(这是我的自定义控件的一部分):

<ContentControl x:Name="SomeText" Margin="10,10,10,0" 
       Content="{TemplateBinding Content}" 
       IsTabStop="False" Grid.Column="1"> 
    <ContentControl.Resources> 
     <Style TargetType="TextBlock" BasedOn="{StaticResource Label}" /> 
    </ContentControl.Resources> 
</ContentControl> 

所以......上面说(我)如果ContentControl以嵌套的TextBlock结束,我们应该应用Label风格,对吗?...但不是,上面的示例中不应用Label风格。

我怎样才能做到这一点?

谢谢。

+0

您是否尝试过使用Snoop或StyleSnooper来查看实际应用的内容? –

回答

5

更新

对于为什么没有得到应用的创建TextBlock样式的说明,请参阅回答5在此链接:Textblock style override label style in WPF

这是因为ContentPresenter创建一个TextBlock一个字符串 的内容,并且由于该TextBlock不在可视树中,因此将查找到Appliacton级别资源 。并且,如果您在Appliaction级别定义了 TextBlock的样式,那么它将应用于ControlControls中的这些 TextBlock。

你可以使用一个DataTemplateSelector

<DataTemplate x:Key="stringTemplate"> 
    <TextBlock Style="{StaticResource Label}"/> 
</DataTemplate> 
<local:TypeTemplateSelector x:Key="TypeTemplateSelector" 
          StringTemplate="{StaticResource stringTemplate}" /> 

<ContentControl ContentTemplateSelector="{StaticResource TypeTemplateSelector}" 
       ...> 

TypeTemplateSelector例如

public class TypeTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate StringTemplate { get; set; } 

    public override System.Windows.DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item is string) 
     { 
      return StringTemplate; 
     } 
     return base.SelectTemplate(item, container); 
    } 
} 

您还可以绑定的Text属性为TextBlock

<Style x:Key="Label" TargetType="TextBlock"> 
    <Setter Property="Text" Value="{Binding}"/> 
    <!-- Additional setters.. --> 
</Style> 
+0

这是很多工作......我不应该能够更简单地做到这一点? – Jeff

+0

@ JeffN825:我同意,用另一种方法使用DataTemplateSelector更新我的答案 –

+0

感谢DateTemplateSelector方法! – Jeff