小编Mar*_*arc的帖子

忽略特定控件的全局样式及其子项

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


问题

我有一个带有一堆默认样式的资源字典。例如,大多数控件类型的默认高度为 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 的东西,它会告诉它,它是子元素,忽略我的资源字典中的样式吗?

c# wpf xaml telerik

5
推荐指数
1
解决办法
1319
查看次数

标签 统计

c# ×1

telerik ×1

wpf ×1

xaml ×1