我已尽力确保这不是其他问题的完全重复,并尝试了很多可能的解决方案。也许我只是没有做正确的搜索。
我有一个带有一堆默认样式的资源字典。例如,大多数控件类型的默认高度为 26,以在我的布局中提供一些一致性。
例如,我有以下 TextBlock 样式
<Style TargetType="TextBlock">
<Setter Property="Height" Value="26"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是 Telerik RadGridView 使用 TextBlock 控件来显示列标题文本,并且这些控件采用默认样式并以 26 的高度结束。
我想获得 RadGridView 及其所有子控件,以忽略资源字典中的样式。
我发现了很多建议将样式设置为 Null 以忽略全局样式的控件。我尝试了以下操作,但没有奏效,因为它似乎不适用于 RadGridView 内的子控件。
<telerik:RadGridView Style="{x:Null}">
...
</telerik:RadGridView>
Run Code Online (Sandbox Code Playgroud)
我发现以下问题有一个我可以修改和使用的解决方案
使用该问题中的答案,我创建了一个转换器来检查控件是否具有特定类型的祖先。代码与上面的问题几乎相同,所以为了避免这个问题太长,我不会在这里粘贴。
我修改了我的风格
<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>
Run Code Online (Sandbox Code Playgroud)
尽管这有效,但我担心随着我的应用程序的增长和越来越多的控件的性能。对于可以在 RadGridView 中使用的许多控件类型,我有类似的触发器。
每个控件都将递归检查它是否具有 RadGridView 作为祖先。大多数不会,所以他们需要一直搜索到他们的基本容器,然后才知道他们没有 RadGridView 作为祖先。
所以在那之后,我的问题是是否有更好的方法来做到这一点?有什么我可以用它包装 RadGridView 的东西,它会告诉它,它是子元素,忽略我的资源字典中的样式吗?