当前位置: 首页 > 知识库问答 >
问题:

WPF MouseDown事件

葛雪松
2023-03-14

我有一个视觉树,看起来像这样:

一个边框,包含一个ScrollViewer,其中包含一个TexBlock

滚动查看器(ScrollViewer)占据了滚动查看器(ScrollViewer)边框(Border)的100%空间,而文本块(TextBlock)可能会也可能不会占据滚动查看器(ScrollViewer)的100%空间,具体取决于html" target="_blank">用户的配置方式。

我想为用户单击边框中的任何位置捕获鼠标向下事件。当我为边框或滚动查看器注册鼠标向下事件时,不会调用回调。当我将鼠标向下(MouseDown)事件注册到文本块(TextBlock)时,回调确实会被调用,但当然只能在文本块(TextBlock)的可点击区域调用,而不是在边框(Border)的整个区域调用。

我的一个想法是创建某种顶级元素,它将覆盖整个控件,将其可见性设置为隐藏,然后从中获取鼠标向下。

有什么建议吗?如果这个问题有什么不清楚的地方,请告诉我,我会解决它。

显示每个请求的示例代码

// Need to know when a user clicks on anything inside of the border, but the 
// because there are items above it, the mouse event doesn't get invoked.
Border border = new Border();
ScrollViewer viewer = new ScrollViewer();
TextBlock textBlock = new TextBlock();

border.Content = viewer;
viewer.Child = textBlock;

共有2个答案

鄢承运
2023-03-14

还有一种方法(虽然不是那么干净的IMO),但如果您需要一些自定义行为,它可能是有用的...也许:)

我们创建自定义滚动查看器,然后使用它而不是标准的滚动查看器,我们的自定义控件只会将其鼠标按下事件传播到其父控件(此示例过于简单,因此不适合在当前状态下的生产中使用)。

public class CustomScrollViewer : ScrollViewer
{
    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        ((e.Source as FrameworkElement).Parent as UIElement).RaiseEvent(e);
    }
}

对于像我这样不熟悉PreviewMouseDown方法的人的一些信息-它使用称为隧道(从上到下)的路由策略,这与Bubble(从下到上)相反

邹誉
2023-03-14

您可以在边框上注册PreviewMouseDown事件。如果单击包含的元素,它也会激发。

private void Border_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
  var clickedElement = e.OriginalSource;
}
 类似资料:
  • 很多企业在使用诸葛io时,会采集和分析数量非常多(可能会多达几百上千)的用户行为事件。这时,事件查找和组织就变得不够方便。 为此,诸葛io提供了事件分组和重要事件(星标事件)标注功能,当事件很多时,可以对事件进行分门别类地管理。同时,可以从产品业务角度将重要的用户行为标注出来,以便可以在分析时方便、快捷地查找常用、重要的事件。 一、使用场景 1. 在众多事件中,方便、快捷地查找重要事件 在分析过程

  • 事件流 三个过程: 从window对象向下到触发元素的父级元素是捕获过程; 然后触发相应事件 从当前触发事件的节点的父节点开始向上冒泡,冒泡到顶层的window对象 capture phase 捕获过程 target phase 触发过程 bubble phase 冒泡过程 冒泡与捕获 <!DOCTYPE html> <html> <head> <meta charset="utf-8

  • ConnectionMultiplexer 类型提供了许多事件可以用来理解被封装的底层是怎幺工作的。这在记录日志时会特别有用。 ConfigurationChanged - 当连接的配置从 ConnectionMultiplexer 内部发生修改时触发 ConfigurationChangedBroadcast - 当经由发布/订阅接收到重新配置消息时引发; 这通常是由于 IServer.Make

  • 简介 Lumen 事件提供了简单的侦听器实现,允许你订阅和监听事件,事件类通常被保存在 app/Events 目录下,而它们的侦听器被保存在 app/Listeners 目录下。 不同于 Laravel 通常,Lumen 中的事件方法恰好与 Laravel 全栈框架功能一致,所以,请阅读完整的 Laravel 文档 。Lumen 同样支持事件广播,它允许客户端的 JavaScript 监听服务端的

  • xorm 支持两种方式的事件,一种是在 Struct中的特定方法来作为事件的方法,一种是在执行语句的过程中执行事件。 在Struct中作为成员方法的事件如下: BeforeInsert() 在将此struct插入到数据库之前执行 BeforeUpdate() 在将此struct更新到数据库之前执行 BeforeDelete() 在将此struct对应的条件数据从数据库删除之前执行 func Bef

  • 模板事件 BeforeRender方法 AfterRender方法 Action事件 Init方法 Before方法 After方法 Action的方法可以有不同的返回值。不同的返回值所对应的输出也不相同: 如果返回值为error,则检查error是否为nil,如果不为nil,则输出错误信息 如果返回值为string,则将string写到body 如果返回值为[]byte,则输出二进制数据。

  • 在初始化时传入,也可通过实例方法”on”进行事件注册。 作为初始化参数时需要以on开头且全为小写,绑定时为驼峰命名。 不同的回调方法由于所处场景不同,传入的参数会存在区别。 示例: var S = new iSlider({..., onslidechanged: callBack, ...}); S.on('slideChanged', callBack); initialize 初始化开始(

  • 事件流 方式 传递方向 捕获 document ---> html ---> body ---> 目标对象 冒泡 目标对象 ---> body ---> html ---> document 事件模型 模型 绑定方式 阶段 DOM 0 级 <button onclick=""> 或 button.onclick = function() {} ​ IE 特有 button.attachEvent(