我已尽力确保这不是其他问题的完全重复,并尝试了很多可能的解决方案。也许我只是没有做正确的搜索。
我有一堆包含默认样式的资源字典。例如,大多数控件类型的默认高度为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,告诉它和它的子元素,忽略我的资源字典中的样式?
答案 0 :(得分:2)
是的,有更好的方法可以做到这一点:在Resources
RadGridView
本身定义空样式,或者如果要将其应用于所有RadGridViews
- 在资源中定义它RadGridView
样式本身,如下:
<Style TargetType="telerik:RadGridView">
<Style.Resources>
<Style TargetType="TextBlock" />
</Style.Resources>
</Style>
这会阻止RadGridView
的所有孩子继承全局TextBlock
样式(相反,他们会使用“默认”TextBlock
样式)