问题标签 [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.
c# - 如何不处理已由例如已处理的 KeyDown 路由事件。一个文本框
我在 WPF 中有一个带有 KeyDown 事件处理程序的窗口。
当用户按下数字键 (0-9) 时,我会响应该事件。我使用 0-9 作为快捷键来选择单选按钮。例如。按下键 3 将选择第三个单选按钮。
问题是当用户在 TextBox 中按下数字键时,我不想将按键作为快捷方式处理,因为我想保留 TextBox 的默认实现。
现在,当用户在 TextBox 内按下 3 时,TextBox 的文本设置为 3,但也选择了第 3 个单选按钮。
我认为当用户在 TextBox 内按下键时,TextBox 会将 e.Handled 设置为 true,但事实并非如此。
TextBox 也只是一个例子。如果用户在我的层次结构中的其他输入控件中输入某些内容,我不想响应 KeyDown 事件。
我想我需要更好地理解路由事件来解决这个问题,或者可能以另一种方式解决这个问题?
c# - 任何人都可以在 WPF 中引发任何 RoutedEvent 吗?
在 C# 中,事件总是受到非常严格的保护:只有事件的所有者才能触发它们。但是,这在 WPF 中似乎完全不同——任何人都可以随时抛出任何事件。为了测试这一点,我在底部编写了代码。
当我使用 RaiseEvent 来引发 Button.Click 时,上面的事件捕获了它。这是 WPF 事件的计划行为吗?只是让任何人抛出他们想要的任何事件?另外,如果是这样,那么注册事件时 OwnerType 的含义是什么?我认为这是某种保护,但如果是这样,那就太糟糕了,因为任何人都可以访问公共事件并使用 AddOwner 函数添加更多所有者。
谢谢!
XAML
背后的代码
自定义控件:
和处理程序:
c# - WPF中的类监听器和实例监听器有什么区别?
我试图围绕一些 WPF 特定的东西,但尚未找到 UIElement.AddHandler 方法和 EventManager.RegisterClassHandler 方法之间的具体关系。
我搜索了一下,发现了这篇有趣的 MSDN 文章:
http://msdn.microsoft.com/en-us/library/ms747183.aspx
这里说:
“路由事件考虑事件的两种不同类型的侦听器:类侦听器和实例侦听器。类侦听器的存在是因为类型在其静态构造函数中调用了特定的 EventManager API,RegisterClassHandler,或者已从元素库覆盖了类处理程序虚拟方法类。实例侦听器是特定的类实例/元素,其中一个或多个处理程序已通过调用 AddHandler 为该路由事件附加。
好吧,现在我知道类和它的实例之间的区别,但不知何故,我无法理解文档的这个特定部分。
谁能帮我解决这个问题?
wpf - 可以/应该 MouseEnter 事件冒泡吗?
在任何情况下都有可能让 MouseEnter 事件冒泡吗?
MSDN 说这是一个带有直接路由策略的附加事件,从技术上讲,它排除了这种可能性。我有一个相当复杂的控件(本质上是一个由网格、堆栈面板和内容控件组成的层次结构)。我似乎从下向上传播了 MouseEnter 事件,这是从 OnMouseEnter 处理程序中获取的调试转储(我在层次结构的不同级别包含相同的自定义控件,它处理 MouseEnter,所以我有一个监听该事件的中心位置) :
在:父:s7b,时间戳:37989609
在:父:s2,时间戳:37989609
在:父:根,时间戳:37989609
s7b、s2 和 Root 是 FrameworkElement 名称,时间戳是来自 MosueEnter 事件的 e.Timestamp。
假设路由策略是直接的,WPF 如何决定事件发起者?它是否遍历可视化树,直到找到第一个附加了 MouseEnter 事件的 FrameworkElement?
当我正在为这个问题制作一个简约的重现集时,有人可以提出可能导致这种行为的原因吗?
这是再现:
- 创建两个自定义控件,一个是常量控件,另一个是事件接收器。
1.1。我的内容控件
代码:
XAML:
1.2 鼠标事件接收器
代码:
XAML:
- 最后是我的测试工具的标记:
XAML:
为了重现问题,只需将鼠标悬停在最右边的灰色方块上并观察“调试输出”窗口,您将在那里看到三个条目,而我只期待一个。
干杯。
wpf - 每当其值更新时,如何使 WPF TextBlock 旋转?
每当绑定更新时,我都会尝试将 TextBlock 旋转 360 度。
从我读过的所有内容来看,以下内容应该可以工作,但是它没有任何效果。我究竟做错了什么?
wpf - WPF - 在我的自定义控件上覆盖 IsVisible
我有一个自定义控件(一个 Adorner),它包装了另一个控件(一个文本框)。
我希望能够覆盖 VisibilityChanged 以便 MyCustomAdorner 的事件仅在 Child 的可见性发生变化时才被触发,而不是实际的装饰器。我该怎么办?
c# - 无法处理 PreviewMouseDown
嘿; 我在用户控件中有以下视觉层次结构:
网格 -> 画布 -> MyContentControl
MyContentControl 是从 ContentControl 派生的一个类,顶部有一个矩形装饰器,这是为了更容易单击某些对象(增加命中测试区域)。装饰者始终在场,但背景透明。
我希望看到当我从用户控件的代码隐藏中单击 MyContentControl 时引发的 PreviewMouseDown 事件,但该事件似乎没有在那里引发,只是在装饰者级别。
该事件在装饰器级别处理,但 e.IsHandled 未设置为 true,因此它应该继续冒泡或隧道。根据我的阅读,PreviewMouseDown 是隧道,而 IIRC,它应该首先在用户控件中提出。
我错过了什么吗?
谢谢你。
wpf - 从根容器获取 TreeViewItem 数据上下文
我有一个带有两个使用控件的窗口。一个封装了一个 TreeView 控件,另一个只是一个选定的 TreeViewItems 详细信息的字符串表示形式。
TreeView 控件已经是自给自足的——它会用内容项填充自己。每个 TreeViewItem 都有一个数据上下文。
这是我需要发生的事情:
- 每当用户单击一个项目时,它都会生成一个 Selected 路由事件,该事件在我的窗口的根容器中被捕获。
- 我需要事件处理程序,它处理选定的路由事件,以便能够从选定的 TreeViewItem 的数据上下文中获取一些数据(属性值)。
- 基于这个值,我的事件处理程序将创建一个 DetailsView 控件并用数据填充它。
在处理 Selected 事件方面,我的方法是否正确?如何从我的选定项目数据上下文中获取属性值?
谢谢你。
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 事件处理程序,它在标题栏中显示一条消息,指示鼠标是在堆栈面板上还是在堆栈面板之外。
问题是:当鼠标在标签上(反过来包含在堆栈面板中)时,鼠标(正确地)报告为在堆栈面板上。当鼠标移动到画布上(也包含在堆栈面板中)时,鼠标(错误地?)报告为不在堆栈面板上,但是当鼠标向右移动一点时(在两个椭圆上,位于画布上),则报告鼠标再次位于堆栈面板上。
为什么当鼠标在画布上时它被报告为不在堆栈面板上,但当鼠标在椭圆(画在画布上)上时它被报告为在堆栈面板上?
感谢您阐明问题,
约翰。
wpf - WPF 依赖属性解决方法
主窗口下有 3 个用户控件。每个控件都有自己的保存按钮。主窗口有一个 SaveAll 按钮。
MainWindow 有一个 ContentControl,并且 content 属性绑定到 VM。在 ButtonClickCommand 上运行时,视图被实例化并分配给内容属性。
此 SaveAll 按钮将在内部调用与 UserControls Save 按钮关联的方法。因此,SaveAll 没有它自己的方法。
这必须由 DependencyProperty 实现。
我曾经在商业应用程序中看到过这种场景,但不知何故错过了它背后的概念。
我不明白这背后的逻辑是什么,但这是一件非常有用的事情。
现在我必须实现这一点,但我错过了一件小事,我不知道。
我希望情况很清楚。
请在这种情况下使用代码帮助我。
谢谢,VJ