在鼠标悬停或焦点上应用条件样式

时间:2012-02-06 10:55:12

标签: wpf xaml

我试图在控件处于特定状态时将自定义样式应用于控件,此样式可以作为样式在对象上设置。但是,在设置触发器时,无法再次设置样式属性:

<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属性。

然而,哪个是有道理的呢?我无法绑定到setter列表,因为它只是readonly。

3 个答案:

答案 0 :(得分: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的实例的StaticResource绑定到该属性,因此您可能需要从ContentPresenter转换为具有此功能的内容。

或者,可以选择使用DataTemplateSelector。

答案 1 :(得分:1)

您可以更改自己风格的Template属性。

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

答案 2 :(得分:0)

不允许样式对象影响它所适用的对象的Style属性......

Windows-Presentation-Foundation.com中查看此内容以了解详情...