我有一个自定义的WPF控件。它有一个绑定到模板内容属性的嵌套ContentControl,因此它可以将任何对象设置为其内容。
如果内容是一个原始字符串,我希望将以下样式应用于TextBlock (我知道当Visual Tree实际呈现时,如果将ContentControl的content属性设置为string,则会生成一个带有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>上面的So...the (对我说)如果ContentControl以嵌套的TextBlock结束,我们应该应用标签样式,right?...but no,标签样式在上面的例子中没有应用。
我如何才能做到这一点呢?
谢谢。
发布于 2011-07-15 12:05:38
更新
有关未应用所创建TextBlock的样式的原因的解释,请参阅此链接上的答案5:Textblock style override label style in WPF
这是因为ContentPresenter为字符串内容创建了一个TextBlock,由于该TextBlock不在可视化树中,因此它将查找Appliacton级别的资源。如果您在应用程序级为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的Text属性
<Style x:Key="Label" TargetType="TextBlock">
<Setter Property="Text" Value="{Binding}"/>
<!-- Additional setters.. -->
</Style>https://stackoverflow.com/questions/6702237
复制相似问题