在stackPanel通用应用程序上悬停时修改前景颜色

时间:2015-12-18 13:29:46

标签: win-universal-app windows-10-universal

我有一个包含StackPanels的splitview,我想定义一种在悬停在每个StackPanel中时修改颜色的样式,这可能吗?

这是我的代码:

 <StackPanel Orientation="Horizontal" Style="{Binding Source={StaticResource HyperlinkPointerOverForegroundThemeBrush}}" >
                    <Button x:Name="MenuButton1"
                    Width="50" Height="50" Background="Transparent">
                        <Button.Content>
                            <Image Source="images/chercher.png"></Image>
                        </Button.Content>
                    </Button>
                    <TextBlock Text="Resultats" FontSize="18" VerticalAlignment="Center" Foreground="#727271"/>
                </StackPanel>

我定义了这样的样式:

 <SolidColorBrush x:Key="HyperlinkButtonBackgroundThemeBrush" Color="#e6e6e6" />
        <SolidColorBrush x:Key="HyperlinkButtonBorderThemeBrush" Color="#e6e6e6" />
        <SolidColorBrush x:Key="HyperlinkDisabledThemeBrush" Color="#e6e6e6" />
        <SolidColorBrush x:Key="HyperlinkForegroundThemeBrush" Color="#e6e6e6" />
        <SolidColorBrush x:Key="HyperlinkPointerOverForegroundThemeBrush" Color="#e6e6e6" />
        <SolidColorBrush x:Key="HyperlinkPressedForegroundThemeBrush" Color="#e6e6e6" />

但是当我悬停时,StackPanels Foreground都没有改变

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我认为你不能只用风格做到这一点。但是,如果你真的想要使用一种风格,你可以结合一种行为。 该行为可以使用PointerEntered和PointerExited事件来设置新的背景。接下来,可以在您的样式中设置行为。 为了实现此类解决方案,您必须添加Behaviors SDK扩展(转到添加引用&gt;通用Windows&gt;扩展)。 行为的定义(例如):

TextBlock

在xaml中,您必须为Interactivity命名空间添加“using”:

public class HoverBehavior : DependencyObject, Microsoft.Xaml.Interactivity.IBehavior
{
    private Panel _associatedObject;
    private Brush _baseBrush;

    public Brush HoverBrush
    {
        get { return (Brush)GetValue(HoverBrushProperty); }
        set { SetValue(HoverBrushProperty, value); }
    }

    public static readonly DependencyProperty HoverBrushProperty =
        DependencyProperty.Register("HoverBrush", typeof(Brush), typeof(HoverBehavior), new PropertyMetadata(null));

    public Brush DefaultBrush
    {
        get { return (Brush)GetValue(DefaultBrushProperty); }
        set { SetValue(DefaultBrushProperty, value); }
    }

    public static readonly DependencyProperty DefaultBrushProperty =
        DependencyProperty.Register("DefaultBrush", typeof(Brush), typeof(HoverBehavior), new PropertyMetadata(null));

    public DependencyObject AssociatedObject
    {
        get { return _associatedObject; }
    }

    public void Attach(DependencyObject associatedObject)
    {
        _associatedObject = associatedObject as Panel;
        if (_associatedObject != null)
        {
            _baseBrush = _associatedObject.Background;
            if (_associatedObject != null)
            {
                _associatedObject.PointerEntered += _associatedObject_PointerEntered;
                _associatedObject.PointerExited += _associatedObject_PointerExited;
            }
        }
    }

    private void _associatedObject_PointerExited(object sender, PointerRoutedEventArgs e)
    {
        if (_associatedObject != null)
            _associatedObject.Background = HoverBrush;
    }

    private void _associatedObject_PointerEntered(object sender, PointerRoutedEventArgs e)
    {
        if (_associatedObject != null)
            _associatedObject.Background = DefaultBrush ?? _baseBrush;
    }

    public void Detach()
    {
        _associatedObject.PointerEntered -= _associatedObject_PointerEntered;
        _associatedObject.PointerExited -= _associatedObject_PointerExited;
    }
}

并且,您可以定义一个新样式(例如,名为SpStyle):

<Page xmlns:i="using:Microsoft.Xaml.Interactivity" />

当鼠标指针悬停在StackPanel上时,行为的HoverBrush属性是StackPanel的颜色,而当鼠标指针没有悬停在StackPanel上时,DefaultBrush(可以取消设置)是StackPanel的颜色。