2014-10-28 74 views
0

我在我的UI中有一个标签并且有一个样式。WPF标签IsMouseOver样式在点击后不起作用

<Style x:Key="ColorChangingLabel" TargetType="{x:Type Label}"> 
    <Setter Property="FontSize" Value="13"></Setter> 
    <Setter Property="Foreground" Value="#ff676767"></Setter> 
    <Setter Property="Background" Value="White"></Setter> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="#ffEAECEE"></Setter> 
      <Setter Property="Foreground" Value="#ff0067B0"></Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

除了MouseOver触发我也想设置相同的属性值在单击标签时(如点击事件不适用于标签我使用MouseDown事件)。 这里是MouseDown事件代码

private void myLabel_MouseDown(object sender, MouseButtonEventArgs e){ 
    myLabel.Foreground = new SolidColorBrush(Color.FromArgb(0xff, 0x00, 0x67, 0xB0)); 
    myLabel.Background = new SolidColorBrush(Color.FromArgb(0xff, 0xea, 0xec, 0xee)); 
} 

所以我的问题是,如果我的鼠标了我的标签上,之后我的鼠标悬停的风格永远不会应用到我的标签。我知道风格重写,但不知道如何摆脱这一点。

回答

1

MouseDown处理程序设置局部值ForegroundBackground,和当地的价值优先于所有其他的价值来源,包括那些由触发器和setter方法设置。有关更多信息,请参阅MSDN上的Dependency Property Value Precedence

使用SetCurrentValue改变当前的属性值,而无需切换到本地值:

myLabel.SetCurrentValue(
    Control.ForegroundProperty, 
    SolidColorBrush(Color.FromArgb(0xff, 0x00, 0x67, 0xB0))); 

另外,应用自定义样式到使用触发器来改变ForegroundBackgroundmyLabel,并且摆脱了事件处理程序完全。

+0

谢谢@Mike。第二种解决方案对我很好。我只写了另一种风格,点击标签时只需以编程方式应用该风格。 – 2014-10-29 08:40:07