在 WPF 中更改组合框的背景颜色而不粘贴整个模板?

问题描述 投票:0回答:2

我知道你可以右键单击,编辑模板>编辑副本,粘贴整个 ComboBox 模板,然后更改几行,但是真的没有办法只用几行代码就可以更改背景吗?

我能够用这段代码实现它,但这消除了下拉箭头/菜单,这基本上使它变得无用。

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="Background" Value="Red" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter></ContentPresenter>
                </Border>
            </ControlTemplate>
         </Setter.Value>
    </Setter>
</Style>
wpf xaml combobox
2个回答
4
投票

恐怕您不能仅“覆盖”

ControlTemplate
的一部分,并且考虑到
ControlTemplate
的默认
ComboBox
的定义方式,您不能简单地设置或属性或创建带有触发器来更改的派生样式它的背景颜色。这在这里有详细解释。

您可以做的是在运行时以编程方式更改加载的模板元素的背景:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    ToggleButton toggleButton = comboBox.Template.FindName("toggleButton", comboBox) as ToggleButton;
    if (toggleButton != null)
    {
        Border border = toggleButton.Template.FindName("templateRoot", toggleButton) as Border;
        if (border != null)
            border.Background = Brushes.Yellow;
    }
}

XAML:

<ComboBox Loaded="ComboBox_Loaded">
    <ComboBoxItem Background="Yellow">1</ComboBoxItem>
    <ComboBoxItem Background="Yellow">2</ComboBoxItem>
    <ComboBoxItem Background="Yellow">3</ComboBoxItem>
</ComboBox>

另一个选项是将整个模板复制到 XAML 标记中并根据您的要求进行编辑。


0
投票

根据已接受的答案,我派生了一个基于 ComboBox 的新类,它将背景属性重新应用于模板化背景属性。 现在它可以像在 Windows 7 中一样正常工作,并且不需要大量的 horid 模板。

public class MyComboBox : ComboBox
{
    public MyComboBox()
    {
        Loaded += MyComboBox_Loaded;
    }

    private void MyComboBox_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        if (Template.FindName("toggleButton", this) is ToggleButton toggleButton)
        {
            if (toggleButton.Template.FindName("templateRoot", toggleButton) is Border border)
                border.Background = Background;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.