C# WPF ComboBox 鼠标悬停颜色

7
当鼠标悬停在我的ComboBox上时,我会得到一个可怕的蓝色/浅蓝色背景配对。 我尝试了这里的解决方案:ComboBox Mouse over colorWPF Combobox Mouse OverHow to style ComboBox Background on Mouse Hover?WPF combobox default hover color on togglebutton,但仍然没有改变任何东西,我仍然在悬停时得到默认颜色。
有什么建议吗?
提前感谢大家, Demasiado。
以下是XAML代码:
<Window x:Class="Homepage.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:sys="clr-namespace:System;assembly=mscorlib" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    <Window.Resources>
        <Storyboard x:Key="TileZoomIn">
            <ThicknessAnimation Storyboard.TargetProperty="Margin" From="10" To="1" Duration="0:0:0.1"/>
        </Storyboard>
        <Storyboard x:Key="TileZoomOut">
            <ThicknessAnimation Storyboard.TargetProperty="Margin" From="1" To="10" Duration="0:0:0.1"/>
        </Storyboard>
        <DropShadowEffect x:Key="DropShadowEffect" BlurRadius="20" Opacity="1" ShadowDepth="0" Color="White"/>
    </Window.Resources>

    <Grid ShowGridLines="True">
        <ComboBox Name="comboBoxTRIG" FontSize="40" Width="210" Height="98" HorizontalAlignment="Left" HorizontalContentAlignment="Center" Margin="40,-180,0,256" Background="Transparent" BorderBrush="Transparent" Foreground="White" BorderThickness="0">
            <ComboBox Margin="25" Width="130" Height="50">
                <ComboBox.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green"/>
                </ComboBox.Resources>
            </ComboBox>
        </ComboBox>
    </Grid>
</Window>

1
请发布您的XAML代码 - Frebin Francis
欢迎来到SO的好开端 - 这是良好开展研究和格式良好的问题的示例。 - Sabuncu
你的 App.xaml 中有任何资源字典吗?可能会覆盖组合框的默认样式?另外,为什么要在组合框中嵌套一个组合框? - Michal Ciechan
@Michel Ciechan:在一个组合框内放置另一个组合框是一个错误,因为我已经改了代码1亿次,所以粘贴复制出了问题。没有什么诀窍或特别之处,我只是想在鼠标指针经过时更改组合框的默认颜色...我不敢相信我已经花了3天时间,却没有向正确的方向迈进一步。 我不明白您关于App.xaml的问题。什么是资源字典?抱歉,英语不是我的母语,有时它并没有帮助... - Encore
@Eran otzap:为什么是ComboBoxItem?我的问题在于comboBox本身。 - Encore
显示剩余3条评论
4个回答

3
你的问题源于ToggleButton模板中的ButtonChrome。请从ToggleButton中移除它。
   ComboBox -> ToggleButton -> ButtonChrome 

步骤:

1)打开Expression Blend并编辑ComboBox的样式副本,这将给您ComboBox的样式+它的模板和所有模板部件,其中包括有问题的ToggleButton。

2)找到ToggleButton及其名为“ComboBoxReadonlyToggleButton”的样式。

3)在“ComboBoxReadonlyToggleButton”中,用一个Border替换Themes:ButtonChrome(如下面第3个代码块所示)。

ComboBox的默认模板(简化版!):

<ControlTemplate TargetType="{x:Type ComboBox}">
    <Grid x:Name="MainGrid" SnapsToDevicePixels="true">                                 
        <Popup x:Name="PART_Popup">
            .....
        </Popup>
        <ToggleButton  Style="{StaticResource ComboBoxReadonlyToggleButton}"/>
        <ContentPresenter ... />
    </Grid>                     
</ControlTemplate>

切换按钮的样式和模板(简化版!)。
<Style x:Key="ComboBoxReadonlyToggleButton" TargetType="{x:Type ToggleButton}">     
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Themes:ButtonChrome x:Name="Chrome" ....>
                    <Grid>
                        <Path x:Name="Arrow" />
                    </Grid>
                </Themes:ButtonChrome>  
             </ControlTemplate>             
        </Setter.Value>
    </Setter>
</Style> 

您需要做的是覆盖默认的ComboBox模板,并通过将ButtonChrome替换为Border来编辑切换按钮的样式:

 <Setter Property="Template">
     <Setter.Value>
        <ControlTemplate TargetType="{x:Type ToggleButton}">
              <Border x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                <Grid>
                    <Path x:Name="Arrow" />
                </Grid>
            </Border>               
        </ControlTemplate>
    </Setter.Value>
</Setter>

它说它不认识“DownArrowGeometry”。 您编写了3个代码示例,所以我需要复制第一个和第三个,对吗? - Encore
它至少能识别 "..." 吗? - eran otzap
覆盖默认的WPF样式和模板,并更改模板。 - eran otzap
  1. ComboBox的默认模板中,您会看到一个带有样式的切换按钮。'ComboBoxReadonlyToggleButton'
  2. 'ComboBoxReadonlyToggleButton'样式
  3. 您需要在'ComboBoxReadonlyToggleButton'中进行更改,以便删除ButtonChrome,这是导致问题的原因。
- eran otzap
@Encore 我尝试让它更清晰,看一下我回答的编辑。 - eran otzap
显示剩余3条评论

2

您可以在ComboBox范围内覆盖SystemColors.HighlightBrushKey

<ComboBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green"/>
</ComboBox.Resources>

示例

整个XAML可以像这样:

<Grid>
    <ComboBox Margin="25" Width="130" Height="50">
        <ComboBox.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green"/>
        </ComboBox.Resources>
        <ComboBox.ItemsSource>
            <Binding Path="Collection" Source="{StaticResource viewmodel}"/>
        </ComboBox.ItemsSource>
    </ComboBox>
</Grid>

回复您的评论:

忽略viewmodel和我的ItemSource,您应该使用自己的,这只是为了演示。

至于您关于

我什么也做不了

我建议您创建一个新项目,仅测试此XAML(当然要使用您的ItemSource),看看是否可以获得想要的结果。当您获得了结果后,您可以转到真正的项目中查看样式更改以及问题所在。

编辑#2:

为了更改ToggleButton的颜色,我认为最好覆盖整个ComboBox样式。

enter image description here

我使用了

 <ControlTemplate x:Key="ComboBoxToggleButton"
                 TargetType="{x:Type ToggleButton}">

其余的代码和样式来自这里

我建议你也阅读这篇文章


我的XAML已经按照这种方式编码了,但它不起作用。 唯一的区别是我没有<ComboBox.ItemsSource>标签。但当我写它时,它说不认识“viewmodel”。 我尝试了stackoverflow上找到的所有方法,但什么都没能让它工作。 - Encore
1
所以我创建了一个新的空项目,只是复制了你上面写的那行代码。但是仍然没有进展,无论我尝试什么,都是默认的双色(蓝色)高亮颜色。 顺便说一下,我不知道如何提及我的自定义视图模型,所以我刚刚删除了<ComboBox.ItemsSource>块。 有什么建议吗? - Encore
当你谈论那个蓝色的高亮时,它是在所选项目上还是按钮本身上?你能否发布一下你制作的新项目的XAML和CS代码? - Sagiv b.g
1
现在我明白了,我的例子是指所选项目的高亮显示,而不是按钮本身。(您可以在我上传的截图中清楚地看到这一点,因为按钮被突出显示为蓝色,而所选项目为绿色) - Sagiv b.g
哦,是的。绿色的颜色。我看到的清楚的是ComboBox精确相同的蓝色颜色,我注意到了那个... - Encore
感谢您的帮助Sag1v,我已经查看了这个MSDN页面来解决另一个问题。我不够熟练,无法理解应该保留什么和可以舍弃什么, 例如,我复制了整个MSDN代码示例,尝试将ControlMouseOverColor更改为0xFF000000或0XFFFFFFFF,但它并没有改变任何东西。我真的一点头绪都没有。 - Encore

0

在测试项目的ComboBox中没有任何项。我只是将鼠标悬停在上面,整个控件就变成了蓝色。 这是.cs文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

这是 XAML 代码:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox Name="comboBoxTRIG" FontSize="40" Width="210" Height="98" HorizontalAlignment="Left" HorizontalContentAlignment="Center" Margin="42,38,0,184" Background="Red" BorderBrush="Transparent" Foreground="White" BorderThickness="0">
            <ComboBox Width="130" Height="50">
                <ComboBox.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green"/>
                </ComboBox.Resources>
            </ComboBox>
        </ComboBox>

    </Grid>
</Window>

0

在您的窗口资源中重新定义comboxItem模板

<Style TargetType="{x:Type ComboBoxItem}"
               BasedOn="{StaticResource {x:Type ComboBoxItem}}">
            <Setter Property="Template">
                <Setter.Value>

                    <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                        <Border Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Margin="{TemplateBinding Margin}"
                                Padding="{TemplateBinding Padding}">
                            <ContentPresenter Margin="{TemplateBinding Margin}"
                                                  VerticalAlignment="{TemplateBinding VerticalAlignment}"
                                                  HorizontalAlignment="{TemplateBinding HorizontalAlignment}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" 
                            Value="Red"/>
                </Trigger>
            </Style.Triggers>

        </Style>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接