【问题标题】:C# WPF ComboBox Mouse over colorC# WPF ComboBox 鼠标悬停在颜色上
【发布时间】:2015-09-08 22:26:32
【问题描述】:

当鼠标悬停在我的 ComboBox 上时,我的 ComboBox 的背景会出现一对可怕的蓝色/浅蓝色。 我在这里尝试了解决方案:ComboBox Mouse over colorWPF Combobox Mouse OverHow to style ComboBox Background on Mouse Hover?WPF combobox default hover color on togglebutton,但它没有改变任何东西,我仍然在悬停时获得默认颜色。

有什么建议吗?

提前谢谢大家, 德马西亚多。

这是 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>

【问题讨论】:

  • 同时发布您的 XAML 代码
  • 欢迎在 SO 上有一个良好的开端 - 这是一个进行良好研究和格式良好的问题的示例。
  • 您的 App.xaml 中有资源字典吗?可能覆盖组合框的默认样式?另外,为什么组合框在组合框内?
  • 创建一个带有 IsMouseOver 触发器的 ComboBoxItem 样式并将其指定为 ItemContainerStyle
  • @Michel Ciechan :comboBox 内的comboBox 是一个错误,因为我将代码更改了10 亿次,所以复制粘贴不正确。没有技巧,没有什么特别的,我只是想在鼠标指针经过它时更改组合框的默认颜色......我不敢相信我已经在这一点上花了 3 天时间而没有迈出一步好的方向。我不明白您关于 App.xaml 的问题。什么是资源字典?对不起,英语不是我的母语,有时它只是没有帮助......

标签: c# wpf combobox


【解决方案1】:

您的问题来自 ToggleButton 模板中的 ButtonChrome。从 ToggleButton 中删除它。

   ComboBox -> ToggleButton -> ButtonChrome 

步骤:

1) 打开 Expression Blend 并编辑 ComboBox 的 Style 的副本,这将为您提供 ComboBox 的 Style + 它的 Template 和所有它的 TemplateParts ,其中有问题的 ToggleButton。

2) 找到 ToggleButton,它的 Style 名为“ComboBoxReadonlyToggleButton”。

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

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>

【讨论】:

  • 它说它不知道“Do​​wnArrowGeometry”。你写了3个代码示例,所以我必须复制第一个和第三个,对吧?
  • 它是否在列表中识别“...”??
  • 你什么都不复制。它被简化为“!”所以它真的很简化。 google:覆盖默认样式和模板 wpf。并更改模板
  • 我没听懂,对不起。
  • 好的。 1) 你知道 WPF 中的 Style 是什么吗? 2) 和一个 ControlTemplate ?
【解决方案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 样式。

我用过

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

其余代码和样式取自here

我建议你也阅读this

【讨论】:

  • 我的 XAML 已经这样编码了,它不起作用。唯一的区别是我没有 标记。但是当我写它时说它不知道“viewmodel”。我尝试了我在 stackoverflow 上找到的所有东西,但我无法得到任何工作。
  • 所以我做了,新的空项目,只是复制了你上面写的那行。仍然没有进展,默认双色(蓝色)突出显示颜色,无论我尝试什么。顺便说一句,我不知道如何提及我自己的视图模型,所以我刚刚删除了 块。有什么建议吗?
  • 当您谈到蓝色突出显示时,它是在所选项目上还是在按钮本身上?能否请您发布您所做的新项目的 XAML 和 CS?
  • 现在我明白了,我的例子是指 Selected-Item 突出显示而不是按钮本身。 (您可以在我上传的打印屏幕中清楚地看到这一点,因为按钮以蓝色突出显示,而 SelectedItem 为绿色)
  • 哦,是的。绿色的颜色。我清楚地看到了与 ComboBox 完全相同的蓝色,我专注于...
【解决方案3】:

在测试项目中我的 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>

【讨论】:

    【解决方案4】:

    在你的窗口资源中重新定义你的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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 2011-04-15
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多