我有一个自定义WPF控件。它有一个嵌套的ContentControl,它绑定到模板的Content属性,因此它可以将任何对象设置为其内容。
如果内容是原始字符串,我想将以下样式应用于TextBlock(我知道当实际呈现Visual Tree时,如果将ContentControl的Content属性设置为字符串,则会生成带有TextBlock的ContentPresenter)
<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 :(得分: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);
}
}
您还必须绑定TextBlock
<Style x:Key="Label" TargetType="TextBlock">
<Setter Property="Text" Value="{Binding}"/>
<!-- Additional setters.. -->
</Style>