首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置ContentControl的样式

设置ContentControl的样式
EN

Stack Overflow用户
提问于 2011-07-15 10:54:18
回答 1查看 1.7K关注 0票数 3

我有一个自定义的WPF控件。它有一个绑定到模板内容属性的嵌套ContentControl,因此它可以将任何对象设置为其内容。

如果内容是一个原始字符串,我希望将以下样式应用于TextBlock (我知道当Visual Tree实际呈现时,如果将ContentControl的content属性设置为string,则会生成一个带有TextBlock的ContentPresenter )。

代码语言:javascript
复制
<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>

我本以为通过嵌套资源(这是我的自定义控件的一部分):

代码语言:javascript
复制
<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,标签样式在上面的例子中没有应用。

我如何才能做到这一点呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-15 12:05:38

更新

有关未应用所创建TextBlock的样式的原因的解释,请参阅此链接上的答案5:Textblock style override label style in WPF

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

您可以使用DataTemplateSelector

代码语言:javascript
复制
<DataTemplate x:Key="stringTemplate">
    <TextBlock Style="{StaticResource Label}"/>
</DataTemplate>
<local:TypeTemplateSelector x:Key="TypeTemplateSelector"
                            StringTemplate="{StaticResource stringTemplate}" />

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

TypeTemplateSelector示例

代码语言:javascript
复制
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属性

代码语言:javascript
复制
<Style x:Key="Label" TargetType="TextBlock">
    <Setter Property="Text" Value="{Binding}"/>
    <!-- Additional setters.. -->
</Style>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6702237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档