- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在任何情况下都可能使 MouseEnter 事件冒泡吗?
MSDN 说这是一个带有直接路由策略的附加事件,技术上排除了这种可能性。我有一个相当复杂的控件(本质上是一个由网格、堆栈面板和内容控件组成的层次结构)。我似乎从下往上传播了 MouseEnter 事件,这是从 OnMouseEnter 处理程序获取的调试转储(我在层次结构的不同级别包含相同的自定义控件,它处理 MouseEnter,所以我有一个中心位置来收听该事件) :
在: parent :s7b,时间戳:37989609
在:父级:s2,时间戳:37989609
在:父:根,时间戳:37989609
s7b、s2 和 Root 是 FrameworkElement 名称,时间戳是来自 MosueEnter 事件的 e.Timestamp。
假设路由策略是直接的,WPF 如何决定事件发起者?它是否会遍历可视化树,直到找到第一个带有附加 MouseEnter 事件的 FrameworkElement?
虽然我正在为该问题制作一个极简主义的重现集,但有人可以提出导致该行为的原因吗?
这是重现:
1.1。我的内容控件
代码:
public class MyContentControl : ContentControl
{
static MyContentControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyContentControl),
new FrameworkPropertyMetadata(typeof(MyContentControl)));
}
protected override void OnMouseEnter(MouseEventArgs e)
{
if (e.Source == e.OriginalSource
&& e.Source is MyContentControl)
{
Debug.Write(string.Format("mouseenter:{0}, timestamp:{1}\n",
(e.Source as MyContentControl).Name,
e.Timestamp));
}
base.OnMouseEnter(e);
}
}
XAML:
<Style TargetType="{x:Type local:MyContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyContentControl}">
<StackPanel Orientation="Horizontal">
<local:MouseEventReceiver />
<ContentPresenter />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
1.2 鼠标事件接收器
代码:
public class MouseEventReceiver : Control
{
static MouseEventReceiver()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MouseEventReceiver),
new FrameworkPropertyMetadata(typeof(MouseEventReceiver)));
}
}
XAML:
<Style TargetType="{x:Type local:MouseEventReceiver}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid Background="LightGray" Width="20" Height="20" Margin="5"></Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
XAML:
<Window x:Class="MouseTricks.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MouseTricks"
Title="MainWindow" Height="350" Width="525">
<Grid>
<local:MyContentControl x:Name="c1">
<local:MyContentControl x:Name="c2">
<local:MyContentControl x:Name="c3" />
</local:MyContentControl>
</local:MyContentControl>
</Grid>
</Window>
为了重现该问题,只需将鼠标悬停在最右边的灰色方 block 上并观察“调试输出”窗口,您会在其中看到三个条目,而我只期望一个。
干杯。
最佳答案
也许更详细的描述会有所帮助。在MSDN article在 Mouse.MouseEnter
上进行了以下引用:
Although this event is used to track when the mouse enters an element, it is also reporting the IsMouseOver property has changed from false to true on this element
MSDN 说 Mouse.MouseEnter
在 IsMouseOver
从 false 变为 true 时触发。看着 MSDN article对于 IsMouseOver
进行了以下引用:
Gets a value that indicates whether the mouse pointer is located over this element (including visual children elements that are inside its bounds)
我们都同意,空背景不支持交互。 null background issue 有很多注意事项关于 IsMouseOver
,但从实际应用中可以明显看出,该值不会因空背景而切换。但是,该定义确实指出,如果鼠标“位于”元素边界内的任何可视子元素上,则 IsMouseOver
将发生变化,但有几个奇怪的警告。但是,空背景不是这些注意事项之一。
使用 snoop utility 快速查看控件的可视化树或 VisualTreeHelper
显示所有三个灰色网格都是 c1
的视觉子级,最右边的两个网格是 c2
的视觉子级,最右边的网格是 c3
的视觉子项。这是预期的,因为您的所有内容控件都嵌套在彼此中。
通过监视 c1
属性的 IsMouseOver
,您可以轻松地看到当鼠标触摸灰色方 block 时,属性值变为 true。您可以通过向主窗口的鼠标移动事件添加回调来验证这一点。我使用了以下回调:
private void MouseMove_Callback(Object sender, MouseEventArgs e)
{
if (c1.IsMouseOver)
MessageBox.Show("Mouse is Over c1!");
}
您会注意到,无论您位于三个灰色方 block 中的哪一个上方,c1
的 IsMouseOver
都设置为 true。这表明 IsMouseOver
在 c1
位于三个方 block 中的任何一个上方时更改为 true,因此 MSDN 所做的声明是正确的。 MouseEnter
应该并且确实会为 c1
触发,无论您触摸哪个灰色方 block ,因为所有三个灰色方 block 都在 c1
的可视化树中,而不是通过警告(例如空背景警告)从鼠标 HitTest 中消除。
正如 MSDN 声称的那样,MouseEnter
事件作为应用程序中的直接事件进行响应。
关于wpf - MouseEnter 事件可以/应该冒泡吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5076764/
我试图在鼠标输入鼠标离开事件时替换图像属性源。单击时,图像应保持事件状态。我需要 mouseleave 事件在单击后停止。到目前为止,点击后鼠标离开仍然继续,切换回图像,代码如下: jQue
我经常看到这样的代码: $("#thing").on("mouseenter",function(){ Do stuff }); 就个人而言,我几乎总是这样写: $("#thing").mouseen
我用 mouseenter 和 mouseleave 制作了一些积木 hover MouseEnter(e) { setTimeout(() => { //check if m
使用菜单目标: https://github.com/hfknight/jQuery-menu-aim/blob/master/jquery.menu-aim.js 在响应方面遇到问题。它使用 mou
我有一个盒子,悬停时会播放加载动画,然后在 2 秒后展开: http://jsfiddle.net/frank_o/WwD5V/23/embedded/result/ 但是如果我按照下面的 V 形 A
我是 Jquery 和 JS 的新手,所以希望有人能够提供帮助!我已经构建了我的第一个图像 slider ,除了手持设备之外,它都运行良好。基本上,当宽度降至某个点以下时,幻灯片会重叠,但是当我将鼠标
我正在编写一个函数,当鼠标进入 DOM 的特定部分以显示菜单时,删除包含内容 display:hidden; 的类。现在,当页面加载并且我最初将鼠标悬停在该区域上时,该事件不会触发。但是,如果我将鼠标
我有一组 3 个菜单项,我正在尝试向其中添加 mouseenter 事件。我似乎根本无法让它发挥作用。我还尝试循环遍历 .menu-item 类,但没有任何反应。 这让我发疯。有谁知道为什么这不起作用
我正在创建一个自定义光标“预告片”(请参阅 fiddle :https://jsfiddle.net/alexdlf/hx6yzu4w/) 通常,圆圈 (.cursor) 应跟随光标。将鼠标悬停在
我有两个对话气泡每两秒更改一次内容。我试图每次将鼠标放在气泡上时,我的changeComment函数都会停止,这样用户将有更多时间阅读评论,当鼠标离开气泡时,函数将再次启动。 我在这里有我的演示:ht
我编写了一段代码,当鼠标悬停在特定元素上时,我需要触发功能。 对于以下所有静态代码,其工作正常 $("table td").on("mouseenter",function(){ consol
我有一个由 5 个 JLabel 对象组成的数组,并且我已向所有对象添加了鼠标监听器,在 mouseEntered() 函数中,我将标签设为不透明(true)更改其背景颜色,但此代码无法正常工作,请帮
我正在尝试进行 mouseEntered 测试来更改方形颜色,但是 MouseListener mouseEntered 不会执行。鼠标有响应,但仅对单击、按下和释放有响应。所以我不确定发生了什么事。
我在尝试制作一个更改其图标的突出显示“标签”时遇到问题,好吧,所以当为一个 jLabel 调用 MouseEntered 事件时,附近的每个标签的事件也会被调用,并且它们的图标也会被更改。我尝试通过使
我必须调用一个由特定元素上的 mouseenter 事件触发的函数。 如何仅当鼠标在特定元素上“停留”超过 5 秒时才触发 mouseenter 事件? 最佳答案 你可以使用定时器(setTimeou
我有两个可排序列表,一个是嵌套的,鼠标输入对嵌套可排序列表的 li 元素有效果。我的问题是,当用户在作为输入字段的子元素上的列表中快速移动鼠标时,mouseenter 和 mouseleave 函数的
我有一些小div,单击它们时,会显示一个更大的div,覆盖所有内容 - 有点像灯箱。为了隐藏大 div,我单击它(没有“关闭此”链接)。 这是点击代码: // First click - draw i
我有一个网站,当您将鼠标悬停在图像上时,图像上会显示一段文本。 达到了预期的效果,除了以下事实:如果您的光标位于图像上的新文本元素上,则所有内容都会开始闪烁。 任何帮助将不胜感激。 这是 fiddle
当元素上触发 mouseenter 事件时,我使用此指令执行某些操作。但是,当我快速拖动鼠标时,在元素上某些元素会被跳过,而不会触发 mouseenter 事件。 我实际上想在鼠标移动时突出显示网格的
基本上,我有一个包含大约 12 个列表项的无序列表。我想在鼠标悬停在其中任何一个上时对它们应用一种样式,而在鼠标不在任何一个上时应用不同的样式。 例如,以下是我当前的代码,它只有在悬停 li 时才具有
我是一名优秀的程序员,十分优秀!