2012-02-06 87 views
2

我想将自定义样式应用于控件,只要它处于特定状态,此样式可以作为样式在对象上设置。然而,设置触发做到这一点的时候,样式属性不能再设置:在鼠标悬停或焦点上应用条件式样

<Style TargetType="{x:Type ContentPresenter}"> 
    <Style.Triggers> 
    <Trigger Property="ContentTemplate" Value="{x:Null}"> 
     <Setter Property="Style" Value="{Binding MouseOverGroupStyle, RelativeSource={RelativeSource TemplatedParent}}" /> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

的Style对象不得影响其适用对象的Style属性。

但是,有什么合理的选择?我无法绑定到setters列表,因为它是只读的。

回答

2

你这里的解决方案是使用一个StyleSelector,它接受ContentPresenter并检查ContentTemplate。

internal class ContentTemplateStyleSelector : StyleSelector 
    { 
     public Style NullStyle { get; set; } 
     public Style DefaultStyle { get; set; } 

     public override Style SelectStyle(object item, DependencyObject container) 
     { 
      var cp = container as ContentPresenter; 

      if (cp == null) 
       return null; 

      if (cp.ContentTemplate == null) 
       return NullStyle; 

      return DefaultStyle; 
     } 
    } 

不幸的是,ContentPresenter没有一个StyleSelector属性,你可以绑定你ContentTemplateStyleSelector的一个实例的静态资源,所以你可能需要从ContentPresenter投射到一些东西,确实。

或者,可以选择使用DataTemplateSelector。

1

您可以更改样式中的Template属性。

另一种可能更好的方法是使用VisualState s。

+0

使用VisualState看起来就像要走的路,这样你也可以定义一个动画来执行鼠标移动。虽然技术上不是我正在寻找的答案,但它看起来是下一个最好的东西。 – Abstractor 2012-02-06 12:11:06