防止在鼠标悬停期间将WPF样式应用于父级

时间:2014-09-17 22:47:09

标签: wpf

我有以下用户控件,它在鼠标悬停时突出显示:

<UserControl x:Class="P.WebEnt.Designer.CanvasControls.Container"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"              
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:ig="http://schemas.infragistics.com/xaml"
         mc:Ignorable="d"              
         d:DesignHeight="300" d:DesignWidth="300">

    <Border.Style>
        <Style>
            <Setter Property="Border.Background" Value="White"/>
            <Style.Triggers>
                <Trigger Property="Border.IsMouseOver" Value="True">
                    <Setter Property="Border.Background" Value="Beige" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Border.Style>


    <StackPanel Orientation="Vertical">
        <ig:DragDropManager.DropTarget>
            <ig:DropTarget IsDropTarget="True">
            </ig:DropTarget>
        </ig:DragDropManager.DropTarget>
        <Label Content="" />
    </StackPanel>

</Border>

在运行时,根据我们的场景,可以将相同的控件作为子控件添加到此控件中(为'n'个级别嵌套相同的用户控件)。

要求是如果相同的控件嵌套在另一个控件中,则子控件上的鼠标悬停应仅突出显示子控件而不突出显示其任何祖先。目前,如果我将鼠标悬停在最内层控件上,它会突出显示所有祖先。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在这里,请使用IsMouseDirectlyOver代替IsMouseOver

    <Trigger Property="Border.IsMouseDirectlyOver"
             Value="True">
        <Setter Property="Border.Background"
                Value="Beige" />
    </Trigger>

假设相关边框是嵌套在其他边框内的唯一元素,如果最内边框中有其他子元素,则可能无法按预期工作。在这种情况下,转换器或附加行为可能有助于实现相同的目标。


修改

我试图以不同的方式解决问题。因为你可以访问类本身,所以我们也许可以在类

中进行

所以将样式中的触发器更改为DataTrigger

<Style>
    <Setter Property="Border.Background"
            Value="White" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsCurrent,RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl}}"
                    Value="True">
            <Setter Property="Border.Background"
                    Value="Beige" />
        </DataTrigger>
    </Style.Triggers>
</Style>

并在Container class

后面的代码中添加以下代码
    protected override void OnMouseMove(MouseEventArgs e)
    {
        Debug.Print(e.Source.GetHashCode().ToString());
        if (CurrentControl != e.Source)
            CurrentControl = e.Source as Container;
        e.Handled = true;
    }

    static Container _CurrentControl;
    static Container CurrentControl
    {
        get
        {
            return _CurrentControl;
        }
        set
        {
            if (_CurrentControl != null)
                _CurrentControl.IsCurrent = false;
            if (value != null)
                value.IsCurrent = true;
            _CurrentControl = value;
        }
    }

    public bool IsCurrent
    {
        get { return (bool)GetValue(IsCurrentProperty); }
        set { SetValue(IsCurrentProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsCurrent.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsCurrentProperty =
        DependencyProperty.Register("IsCurrent", typeof(bool), typeof(Container), new PropertyMetadata(false));

试一试,看看你是否正在寻找。