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

时间:2010-12-16 12:47:59

标签: c# wpf .net-3.5

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

 <Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent">
    <Grid>...Content here...</Grid>
 </Border>

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

2 个答案:

答案 0 :(得分:8)

您可以通过在边框上放置样式并使用Trigger来完成此操作。

请注意,您需要在样式中设置正常颜色,因为直接在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>

您还可以将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>

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

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

答案 1 :(得分:0)

可以使用MouseEnter&amp; amp; MouseLeave来自边界的事件。

的Xaml:

<Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent" MouseEnter="border_MouseEnter" MouseLeave="border_MouseLeave">
    <Grid>...Content here...</Grid>
</Border>

代码隐藏:

private void border_MouseEnter(object sender, MouseEventArgs e)
{
    Border hoveredBorder= (Border)sender;
    hoveredBorder.BorderBrush= Brushes.Yellow;
}

private void border_MouseLeave(object sender, MouseEventArgs e)
{
    Border hoveredBorder= (Border)sender;
    hoveredBorder.BorderBrush= Brushes.Black;
}

编辑:我使用了Border hoveredBorder =(Border)发送者;因此,您可以将这些事件用于多个边框。如果您不想要这个,您可以删除该行&amp;直接获得所需的边框。

Edit2:Example Application