我有一个简单的UserControl,它的直接子元素是一个边框: -
<Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent">
<Grid>...Content here...</Grid>
</Border>
Run Code Online (Sandbox Code Playgroud)
如何检测鼠标是否位于边界区域,即5像素边界?当鼠标在那里时,我想将边框画笔翻转为另一种颜色.当鼠标移动到主网格内容时,我想边框刷回来.
您可以通过在边框上放置样式并使用触发器来完成此操作.
请注意,您需要在样式中设置正常颜色,因为直接在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,如果鼠标在子元素上,它将是假的.然后,您可以将网格上的背景设置为透明,以便鼠标始终位于网格上.(实际上,如果您希望内容具有背景颜色,那么在网格上设置它会更容易.)
| 归档时间: |
|
| 查看次数: |
3928 次 |
| 最近记录: |