【问题标题】:Override style on parts of ComboBox scrollbar覆盖 ComboBox 滚动条部分的样式
【发布时间】:2021-12-22 17:34:23
【问题描述】:

经过大量研究,我偶然发现了一种相对简单的方法,可以仅针对控件样式的特定部分,而无需使用整个控件模板。部分成功,但我需要一点帮助才能完成。

具体来说,我试图在 ComboBox 的下拉列表中覆盖滚动条的 Thumb 按钮颜色。我遇到的很酷的技术如下,它利用嵌套的 Style.Resources 来访问较低的对象...

        <Style x:Key="MyComboBoxStyle" TargetType="{x:Type ComboBox}">
            <Style.Resources>
                <Style TargetType="ScrollViewer">
                    <Style.Resources>
                        <Style TargetType="ScrollBar">
                            <Setter Property="Background" Value="LightGreen" />
                            <Style.Resources>
                                <Style TargetType="Track">
                                    <Setter Property="Cursor" Value="Cross" />
                                    <Style.Resources>
                                        <Style TargetType="Thumb">
                                            <Setter Property="Background" Value="Red"/>
                                            <Setter Property="Cursor" Value="Hand" />
                                        </Style>
                                    </Style.Resources>
                                </Style>
                                <Style TargetType="RepeatButton">
                                    <Setter Property="Background" Value="Red"/>
                                    <Setter Property="Cursor" Value="Hand" />
                                </Style>
                            </Style.Resources>
                        </Style>
                    </Style.Resources>
                </Style>
            </Style.Resources>

        <!--- rest of ComboBox style definition follows... -->

通过使用嵌套的 Style.Resources 依次深入到复杂的控件样式树,我能够针对控件样式的特定方面,而不需要整个样式定义。

上面的 xaml 代码成功地一直向下钻到“Track”...我可以更改 Track 的边距、光标等内容。但是,我似乎无法迈向拇指的最后一步。另外,我似乎无法访问重复按钮,它应该与 Track 处于同一级别(在对象树中)。

查看 ScrollBars 的样式模板似乎表明对象树是 ScrollBar->Track->Thumb... 但我似乎遗漏了什么?

关于如何访问 Thumb 颜色的任何想法?

【问题讨论】:

    标签: c# .net wpf combobox scrollbar


    【解决方案1】:

    ScrollBar 的默认样式在Track 中显式设置ThumbStyle 属性:

    <Track x:Name="PART_Track" ...>
        ...
        <Track.Thumb>
            <Thumb Style="{StaticResource ScrollBarThumbVertical}"/>
        </Track.Thumb>
    </Track>
    

    这意味着您的隐式 Thumb 样式将不会被应用。

    因此,您必须为ScrollBar 定义一个自定义的完整ControlTemplate,以便能够修改Thumb 的样式/模板。

    或者,您可以考虑在运行时在可视化树中查找它并以编程方式设置其任何属性。

    【讨论】:

    • 好的。或者......有没有办法覆盖“ScrollBarThumbVertical”资源,以便当它显式调用它时,它会得到我修改后的样式而不是内置样式?
    • 不,恐怕不是,ScrollBarThumbVertical 资源在应用样式/模板时已解析,因此您需要自己定义Thumb 元素以将 if 的Style 属性设置为别的东西。
    • 好的...谢谢。我现在唯一的障碍是通常的“编辑-> 复制模板”选项对于 ScrollViewer 控件不可用。某种 Visual Studio 错误(显示为灰色)。因此,我正在努力获取完整的 XAML 代码,以便我可以自定义样式 ComboBox。为此,我想我需要 ComboBox、ComboBox Items Container、ScrollViewer 和 ScrollBar(这是定义 Thumb 的地方)。所以,我可以复制 4 个中的 3 个……但不知道从哪里获取 ScrollViewer 的 XAML。
    • 这是您应该编辑的ScrollBar 模板,因此右键单击ScrollBar 并选择编辑模板->编辑副本。
    猜你喜欢
    • 2012-09-29
    • 2021-06-25
    • 2014-10-12
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多