在WPF中直接在边界上检测鼠标

Ant*_*nes 2 c# wpf .net-3.5

我有一个简单的UserControl,它的直接子元素是一个边框: -

 <Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent">
    <Grid>...Content here...</Grid>
 </Border>
Run Code Online (Sandbox Code Playgroud)

如何检测鼠标是否位于边界区域,即5像素边界?当鼠标在那里时,我想将边框画笔翻转为另一种颜色.当鼠标移动到主网格内容时,我想边框刷回来.

Qua*_*ter 8

您可以通过在边框上放置样式并使用触发器来完成此操作.

请注意,您需要在样式中设置正常颜色,因为直接在Border上设置它会设置一个覆盖触发器的本地值.

<Border x:Name="LayoutRoot" BorderThickness="5">
    <Border.Style>
        <Style TargetType="Border">
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="BorderBrush" Value="Green"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
    <Grid>...Content here...</Grid>
</Border>
Run Code Online (Sandbox Code Playgroud)

您还可以将Style放在资源字典中,以便可以在多个Border元素之间共享它:

<UserControl.Resources>
    <Style TargetType="Border" x:Key="borderGreenOnHover">
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<Border x:Name="LayoutRoot" BorderThickness="5"
        Style="{StaticResource borderGreenOnHover}">
    <Grid>...Content here...</Grid>
</Border>
Run Code Online (Sandbox Code Playgroud)

如果鼠标位于边框内,则触发器不会触发.这是因为边框的默认背景为空,而不是透明,因此背景区域不会响应命中测试.如果将Border.Background属性设置为Transparent或另一个Brush,则如果鼠标位于Border上方的任何位置,则会触发该触发器.

如果你想要一个非空的Border背景,但你只想让鼠标在边界区域上时触发,你可以使用IsMouseDirectlyOver而不是IsMouseOver,如果鼠标在子元素上,它将是假的.然后,您可以将网格上的背景设置为透明,以便鼠标始终位于网格上.(实际上,如果您希望内容具有背景颜色,那么在网格上设置它会更容易.)