忽略特定控件的全球风格及其子女

时间:2016-05-27 20:01:57

标签: c# wpf xaml telerik

我已尽力确保这不是其他问题的完全重复,并尝试了很多可能的解决方案。也许我只是没有做正确的搜索。

问题

我有一堆包含默认样式的资源字典。例如,大多数控件类型的默认高度为26,以便在布局中提供一定的一致性。

例如,我有TextBlock的以下样式

<Style TargetType="TextBlock">
    <Setter Property="Height" Value="26"/>
</Style>

我遇到的问题是Telerik RadGridView使用TextBlock控件显示列标题文本,这些控件采用默认样式,最终高度为26。

我想让RadGridView及其所有子控件忽略我的资源字典中的样式。

我试过了,但它没有用

我发现了很多建议,要将样式设置为Null,以便忽略全局样式的控件。我尝试了以下但它没有工作,因为它似乎不适用于RadGridView内部的子控件。

<telerik:RadGridView Style="{x:Null}">
    ...
</telerik:RadGridView>

这可行,但可能不是最佳解决方案

我发现以下问题有一个我能够修改和使用的解决方案

Setting style based on existence of an ancestor type

使用该问题中的答案,我创建了一个转换器来检查控件是否具有特定类型的祖先。代码几乎和上面的问题一样,所以为了防止这个问题太长,我不会把它粘贴在这里。

我将我的风格修改为

<Style TargetType="TextBlock">
    <Style.Triggers>
        <DataTrigger
            Binding="{Binding RelativeSource={RelativeSource Self}, 
            Converter={StaticResource HasAncestorTypeConverter},
            ConverterParameter={x:Type telerik:RadGridView}}"
            Value="False">

            <Setter Property="Height" Value="26"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

虽然这很有效,但随着我的应用程序的增长以及越来越多的控件,我对性能表示担忧。对于可以在RadGridView中使用的许多控件类型,我有类似的触发器。

每个控件都将以递归方式检查它是否有RadGridView作为祖先。大多数人不会,所以他们需要一直搜索到他们的基础容器,然后才知道他们没有RadGridView作为祖先。

我的问题

所以在那之后,我的问题是,是否有更好的方法来做到这一点?有什么东西可以包装RadGridView,告诉它和它的子元素,忽略我的资源字典中的样式?

1 个答案:

答案 0 :(得分:2)

是的,有更好的方法可以做到这一点:在Resources RadGridView本身定义空样式,或者如果要将其应用于所有RadGridViews - 在资源中定义它RadGridView样式本身,如下:

<Style TargetType="telerik:RadGridView">
    <Style.Resources>
        <Style TargetType="TextBlock" />
    </Style.Resources>
</Style>

这会阻止RadGridView的所有孩子继承全局TextBlock样式(相反,他们会使用“默认”TextBlock样式)