我有一个简单的UserControl,其直接的Child元素是一个边框: -
<Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent">
<Grid>...Content here...</Grid>
</Border>
如何检测鼠标是否位于边框区域,即5像素边框本身?当鼠标在那里时,我想将边框画笔翻转为另一种颜色。当鼠标移动到主网格内容时,我想边框刷回来。
答案 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