问题标签 [routed-events]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
688 浏览

c# - 如何不处理已由例如已处理的 KeyDown 路由事件。一个文本框

我在 WPF 中有一个带有 KeyDown 事件处理程序的窗口。

当用户按下数字键 (0-9) 时,我会响应该事件。我使用 0-9 作为快捷键来选择单选按钮。例如。按下键 3 将选择第三个单选按钮。

问题是当用户在 TextBox 中按下数字键时,我不想将按键作为快捷方式处理,因为我想保留 TextBox 的默认实现。

现在,当用户在 TextBox 内按下 3 时,TextBox 的文本设置为 3,但也选择了第 3 个单选按钮。

我认为当用户在 TextBox 内按下键时,TextBox 会将 e.Handled 设置为 true,但事实并非如此。

TextBox 也只是一个例子。如果用户在我的层次结构中的其他输入控件中输入某些内容,我不想响应 KeyDown 事件。

我想我需要更好地理解路由事件来解决这个问题,或者可能以另一种方式解决这个问题?

0 投票
1 回答
8146 浏览

c# - 任何人都可以在 WPF 中引发任何 RoutedEvent 吗?

在 C# 中,事件总是受到非常严格的保护:只有事件的所有者才能触发它们。但是,这在 WPF 中似乎完全不同——任何人都可以随时抛出任何事件。为了测试这一点,我在底部编写了代码。

当我使用 RaiseEvent 来引发 Button.Click 时,上面的事件捕获了它。这是 WPF 事件的计划行为吗?只是让任何人抛出他们想要的任何事件?另外,如果是这样,那么注册事件时 OwnerType 的含义是什么?我认为这是某种保护,但如果是这样,那就太糟糕了,因为任何人都可以访问公共事件并使用 AddOwner 函数添加更多所有者。

谢谢!

XAML

背后的代码

自定义控件:

和处理程序:

0 投票
1 回答
2644 浏览

c# - WPF中的类监听器和实例监听器有什么区别?

我试图围绕一些 WPF 特定的东西,但尚未找到 UIElement.AddHandler 方法和 EventManager.RegisterClassHandler 方法之间的具体关系。

我搜索了一下,发现了这篇有趣的 MSDN 文章:

http://msdn.microsoft.com/en-us/library/ms747183.aspx

这里说:

“路由事件考虑事件的两种不同类型的侦听器:类侦听器和实例侦听器。类侦听器的存在是因为类型在其静态构造函数中调用了特定的 EventManager API,RegisterClassHandler,或者已从元素库覆盖了类处理程序虚拟方法类。实例侦听器是特定的类实例/元素,其中一个或多个处理程序已通过调用 AddHandler 为该路由事件附加。

好吧,现在我知道类和它的实例之间的区别,但不知何故,我无法理解文档的这个特定部分。

谁能帮我解决这个问题?

0 投票
3 回答
3037 浏览

wpf - 可以/应该 MouseEnter 事件冒泡吗?

在任何情况下都有可能让 MouseEnter 事件冒泡吗?

MSDN 说这是一个带有直接路由策略的附加事件,从技术上讲,它排除了这种可能性。我有一个相当复杂的控件(本质上是一个由网格、堆栈面板和内容控件组成的层次结构)。我似乎从下向上传播了 MouseEnter 事件,这是从 OnMouseEnter 处理程序中获取的调试转储(我在层次结构的不同级别包含相同的自定义控件,它处理 MouseEnter,所以我有一个监听该事件的中心位置) :

在:父:s7b,时间戳:37989609

在:父:s2,时间戳:37989609

在:父:根,时间戳:37989609

s7b、s2 和 Root 是 FrameworkElement 名称,时间戳是来自 MosueEnter 事件的 e.Timestamp。

假设路由策略是直接的,WPF 如何决定事件发起者?它是否遍历可视化树,直到找到第一个附加了 MouseEnter 事件的 FrameworkElement?

当我正在为这个问题制作一个简约的重现集时,有人可以提出可能导致这种行为的原因吗?


这是再现:

  1. 创建两个自定义控件,一个是常量控件,另一个是事件接收器。

1.1。我的内容控件

代码:

XAML:

1.2 鼠标事件接收器

代码:

XAML:

  1. 最后是我的测试工具的标记:

XAML:


为了重现问题,只需将鼠标悬停在最右边的灰色方块上并观察“调试输出”窗口,您将在那里看到三个条目,而我只期待一个。

干杯。

0 投票
1 回答
2392 浏览

wpf - 每当其值更新时,如何使 WPF TextBlock 旋转?

每当绑定更新时,我都会尝试将 TextBlock 旋转 360 度。

从我读过的所有内容来看,以下内容应该可以工作,但是它没有任何效果。我究竟做错了什么?

0 投票
1 回答
527 浏览

wpf - WPF - 在我的自定义控件上覆盖 IsVisible

我有一个自定义控件(一个 Adorner),它包装了另一个控件(一个文本框)。

我希望能够覆盖 VisibilityChanged 以便 MyCustomAdorner 的事件仅在 Child 的可见性发生变化时才被触发,而不是实际的装饰器。我该怎么办?

0 投票
1 回答
1220 浏览

c# - 无法处理 PreviewMouseDown

嘿; 我在用户控件中有以下视觉层次结构:

网格 -> 画布 -> MyContentControl

MyContentControl 是从 ContentControl 派生的一个类,顶部有一个矩形装饰器,这是为了更容易单击某些对象(增加命中测试区域)。装饰者始终在场,但背景透明。

我希望看到当我从用户控件的代码隐藏中单击 MyContentControl 时引发的 PreviewMouseDown 事件,但该事件似乎没有在那里引发,只是在装饰者级别。

该事件在装饰器级别处理,但 e.IsHandled 未设置为 true,因此它应该继续冒泡或隧道。根据我的阅读,PreviewMouseDown 是隧道,而 IIRC,它应该首先在用户控件中提出。

我错过了什么吗?

谢谢你。

0 投票
1 回答
1117 浏览

wpf - 从根容器获取 TreeViewItem 数据上下文

我有一个带有两个使用控件的窗口。一个封装了一个 TreeView 控件,另一个只是一个选定的 TreeViewItems 详细信息的字符串表示形式。

TreeView 控件已经是自给自足的——它会用内容项填充自己。每个 TreeViewItem 都有一个数据上下文。

这是我需要发生的事情:

  1. 每当用户单击一个项目时,它都会生成一个 Selected 路由事件,该事件在我的窗口的根容器中被捕获。
  2. 我需要事件处理程序,它处理选定的路由事件,以便能够从选定的 TreeViewItem 的数据上下文中获取一些数据(属性值)。
  3. 基于这个值,我的事件处理程序将创建一个 DetailsView 控件并用数据填充它。

在处理 Selected 事件方面,我的方法是否正确?如何从我的选定项目数据上下文中获取属性值?

谢谢你。

0 投票
1 回答
2609 浏览

c# - WPF 中的 MouseEnter 和 MouseLeave 处理(使用 VS2008 和 .net 3.5)未按预期工作

没有图像,没有代码,很难解释问题。对于那些感兴趣的人,我制作了一个示例 C#/WPF 项目,可以从http://rapidshare.com/files/461745095/02.WPFControlEvents.rar下载

这是一个非常小的项目(45KB)。问题如下(对于扭曲的描述,我深表歉意):

一个“花哨”(而且相当丑陋)的按钮包含一个堆栈面板,该面板又包含 1.) 标签,2.) 画布,3.) 两 (2) 个同心椭圆,全部从左到右布置。

堆栈面板有一个 MouseEnter 和一个 MouseLeave 事件处理程序,它在标题栏中显示一条消息,指示鼠标是在堆栈面板上还是在堆栈面板之外。

问题是:当鼠标在标签上(反过来包含在堆栈面板中)时,鼠标(正确地)报告为在堆栈面板上。当鼠标移动到画布上(也包含在堆栈面板中)时,鼠标(错误地?)报告为不在堆栈面板上,但是当鼠标向右移动一点时(在两个椭圆上,位于画布上),则报告鼠标再次位于堆栈面板上。

为什么当鼠标在画布上时它被报告为不在堆栈面板上,但当鼠标在椭圆(画在画布上)上时它被报告为在堆栈面板上?

感谢您阐明问题,

约翰。

0 投票
2 回答
429 浏览

wpf - WPF 依赖属性解决方法

主窗口下有 3 个用户控件。每个控件都有自己的保存按钮。主窗口有一个 SaveAll 按钮。

MainWindow 有一个 ContentControl,并且 content 属性绑定到 VM。在 ButtonClickCommand 上运行时,视图被实例化并分配给内容属性。

此 SaveAll 按钮将在内部调用与 UserControls Save 按钮关联的方法。因此,SaveAll 没有它自己的方法。

这必须由 DependencyProperty 实现。

我曾经在商业应用程序中看到过这种场景,但不知何故错过了它背后的概念。

我不明白这背后的逻辑是什么,但这是一件非常有用的事情。

现在我必须实现这一点,但我错过了一件小事,我不知道。

我希望情况很清楚。

请在这种情况下使用代码帮助我。

谢谢,VJ