MouseOver突出显示样式在一秒钟后返回默认值(由Aero引起?)
题
我试图设计我的ComboBoxes以匹配UI的其余部分,但我遇到了IsMouseOver突出显示的问题。它突出显示我指定的颜色一秒钟,然后淡化回默认颜色,一种很酷的效果,但不是我想要的。这是我的风格:
<Style TargetType="ComboBox">
<Style.Triggers>
<Trigger Property="ComboBox.IsMouseOver" Value="True">
<Setter Property = "Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
如何保持背景颜色?
解决方案
问题确实是由于ComboBox的默认模板。如果您使用 Reflector 打开PresentationFramework.Aero程序集,您可以查看ButtonChrome类。有一个名为OnRenderMouseOverChanged的方法隐藏了红色背景。
即使它有很多工作,至少对于ComboBox,您可能希望覆盖ComboBox的默认模板。通过使用 Show Me The,您可以了解ComboBox temlpate的基本概念。模板或 Blend 。
您可以使用相同的样式覆盖模板。
<Style TargetType="{x:Type ComboBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<!-- Template Here -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
其他提示
您可以通过从WPF Visual Studio Designer获取默认模板的副本,然后在ComboBoxReadonlyToggleButton样式中注释掉ButtonChrome部分并将其替换为Border来覆盖此行为。这是我找到解决方案的网站的链接 - http://www.scriptscoop.net/t/d346cf01d844/cc-wpf-combobox-mouse-over-color.html
这是我的代码段
<Style x:Key="ComboBoxReadonlyToggleButton" TargetType="{x:Type ToggleButton}">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="ClickMode" Value="Press"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<!-- Replace the ButtonChrome - this eliminated the following
problem: When the mouse was moved over the ComboBox
the color would change to the color defined in ___ but
then would
immediately change to the default Aero blue
gradient background of 2 powder blue colors -
Had to comment out the
below code and replace it as shown
<Themes:ButtonChrome x:Name="Chrome" BorderBrush=" {TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" SnapsToDevicePixels="true">
<Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}">
<Path x:Name="Arrow" Data="{StaticResource DownArrowGeometry}" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/>
</Grid>
</Themes:ButtonChrome>-->
<!-- Here is the code to replace the ButtonChrome code -->
<Border x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
<Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}">
<Path x:Name="Arrow" Data="{StaticResource DownArrowGeometry}" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/>
</Grid>
</Border>
<!-- End of code to replace the Button Chrome -->
我还添加了一些代码来将背景颜色更改为DarkOrange - 此代码进入ControlTemplate(在部分中),用于ComboBox的样式。
<!-- Hover Code - Code that was added to change the ComboBox background
color when the use hovers over it with the mouse -->
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="DarkOrange"></Setter>
</Trigger>
<!-- Hover Code - End -->
不隶属于 StackOverflow