问题标签 [routedevent]
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.
wpf - 为什么 wpftoolkit datepicker 会吃掉返回键按下事件?
我想知道是否有人知道为什么日期选择器会将标准键传递给任何父控件的键向下路由事件,而不是返回键?
这是我写的xaml:
这是我用来检查返回键的代码:
我在意外中使用了 key down (意味着使用 key up),但我发现有趣的是标准数字和 / 字符正在触发逻辑,而不是返回键。任何想法为什么不包括返回键作为按键?
.net - 如何为窗口的嵌套子级捕获 SourceUpdated?
我想知道我的 Window 上的任何输入元素何时更新其绑定源。
输入元素可以是 TextBox、RadioButton、Slider、ComboBox 等,并且可以嵌套在 UserControls 或 Panels 中。
捕获 SourceUpdated 会很好,但它不是路由事件,因此不会冒泡给父级。
有没有一种简单的方法可以做到这一点?
wpf - 已使用 RoutedEvent 名称
在 WPF 中,我创建了 3 个用户控件“用户配置”、“系统配置”和“帐户配置”。所有这些用户控件都有“保存”和“取消”按钮。单击这些按钮时,它们会引发在各自的类中声明和定义的路由事件。单击“保存”按钮时会引发“ConfigurationSaved”事件,并在“取消”按钮上引发“ConfigurationCancelled”事件。
引发这些事件时,承载用户控件的容器将负责保存配置。
所有类的路由事件定义的代码片段如下:
帐户配置视图:
系统配置视图:
用户配置视图:
When I'm using these classes I'm getting TypeInitializationException with the message:
RoutedEvent Name 'ConfigurationSaved' for OwnerType 'baskcode.Admin.Controls.AccountConfigurationView' already used.
Same exception is thrown if I try to load any of the other controls. I'm not able to rectify the problem. Please help me in this regard.
I'm using .Net version 4
Thanks.
wpf - 如何使用 Rx 和 F# 将 WPF Button.Click 事件转换为 Observable
我正在尝试复制一些IObservable
从Button.Click
事件创建的 C# 代码。我想将此代码移植到 F#。
这是编译时没有错误的原始 C# 代码:
这是我在 F# 中尝试做同样的失败的尝试:
除了语句的第二行之外,一切都很愉快。
F# 编译器抱怨是fun h -> RoutedEventHandler(h)
因为它不想将其h
作为RoutedEventHandler
构造函数的参数。
另一方面,C# 编译器似乎没有问题接受h => new RoutedEventHandler(h)
有趣的是,在两个代码示例(C# 和 F#)中,类型h
都是EventHandler<RoutedEventArgs>
.
我从 F# 编译器得到的错误消息是:
错误 2 此表达式的类型应为 obj -> RoutedEventArgs -> unit,但此处的类型为 EventHandler
RoutedEventHandler
我在 PresentationCore 中找到的签名是:
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
如您所见,它确实采用object
andRoutedEventArgs
作为参数,因此 F# 编译器实际上是正确的。
C# 编译器是否有一些魔法在幕后完成了 F# 编译器没有的工作,或者我只是在这里遗漏了一些东西?
无论哪种方式,我怎样才能在 F# 中完成这项工作?
wpf - WPF:如何防止 CheckBox.Checked 事件被触发为 ComboBox 作为 ToggleButton?
我在一个窗口中有很多控件,包括复选框和组合框。我想跟踪 CheckBox.IsChecked 事件,所以我在 Windows 级别定义了一个事件处理程序为
问题是 ComboBox 在鼠标单击一个项目后也会立即触发相同的事件。我认为我的事件处理程序应该只捕获 CheckBox 的 Checked 事件,而不是 ToggleButton 的。我错过了什么吗?
编辑:正如我在下面指出的那样,我认为它会以这种方式工作,因为我阅读了Matthew MacDonald 的书“ Pro WPF in C# 2010 ”。在第 164 页,他首先给出了这个示例代码:
然后,他特别指出:
注意 Click 事件实际上是在 ButtonBase 类中定义的,由 Button 类继承。如果将事件处理程序附加到 ButtonBase.Click,则当单击任何 ButtonBase 派生控件(包括 Button、RadioButton 和 CheckBox 类)时,将使用该事件处理程序。如果将事件处理程序附加到 Button.Click,它仅用于 Button 对象。
现在,我误解了他,还是他的笔记错了?
c# - WPF 附加事件与非附加事件
问题是,经过我所有的研究,我仍然找不到常规路由事件和附加事件之间的区别。功能上有什么区别?还是其他人同意没有?
执行
ButtonBase 类声明了一个名为 ClickEvent 的路由事件;一个正常的路由事件。
Mouse 类声明了一个名为 MouseDownEvent 的路由事件;附加事件。
这两个事件都在 EventManager 中注册,并以相同的方式存储为公共、静态、只读字段。ClickEvent 有一个支持 CLR 事件字段,其中包含分别调用 base.AddHandler 和 base.RemoveHandler 的自定义添加和删除访问器;两者都在 ButtonBase 派生的 UIElement 基类中声明。MouseDownEvent 有两个静态方法 AddMouseDownHandler 和 RemoveMouseDownHandler,它们最终调用 UIElement 中声明的两个 AddHandler 和 RemoveHandler 方法,就像 ClickEvent 一样。
在静态类上声明的实际附加事件的 Add*Handler 和 Remove*Handler 静态方法必须遵循特定的命名约定,以允许 WPF 事件系统使用反射在运行时找到适当的添加和删除处理程序。
用法
这两个事件都可以在 XAML 中附加处理程序,如下所示:
这两个事件都可以附加在代码中,如下所示:
如您所见,这两个事件都可以附加到不拥有或声明它们的元素上。
结论 - 什么是附加事件?
MSDN 文档状态:http: //msdn.microsoft.com/en-us/library/bb613550.aspx
可扩展应用程序标记语言 (XAML) 定义了一种语言组件和称为附加事件的事件类型。附加事件的概念使您能够将特定事件的处理程序添加到任意元素,而不是添加到实际定义或继承事件的元素。在这种情况下,可能引发事件的对象和目标处理实例都没有定义或以其他方式“拥有”事件。
此外,官方 MCTS Training Kit for Exam 70-511 - Windows Applications Development with Microsoft .NET Framework 4 指出:
控件可以为控件自身无法引发的事件定义处理程序。这些事件称为附加事件。例如,考虑网格中的 Button 控件。Button 类定义了 Click 事件,但 Grid 类没有。但是,您仍然可以通过在 XAML 代码中附加 Button 控件的 Click 事件来为网格中的按钮定义处理程序。
在整个 Microsoft 学习资源中,“附加事件”一词似乎很模糊,尽管很明显这里有两个不同但密切相关的概念:附加事件和 XAML 附加事件语法。我引用的两个 Microsoft 资源似乎都指的是 XAML 附加事件语法,而不是实际附加事件。但是,附加事件概述 MSDN 页面确实继续向您展示如何实现实际附加事件,而培训工具包没有。
Mouse.MouseDownEvent 是在具有相应静态添加和删除处理程序的静态类上声明的路由事件的示例,也称为附加事件。但是,ButtonBase.ClickEvent 是一个普通的路由事件,尽管它仍然可以以与实际附加事件相同的方式与 XAML 附加事件语法一起使用。
实际附加事件的目的是允许开发人员为现有的 UIElement 派生类声明新的路由事件,而不必对它们进行子类化;这意味着您可以附加新的路由事件,而无需它们实际存在于您要引发或处理它们的类上。但是,等一下……这不是纯路由事件的主要目的吗?
MSDN 上的路由事件概述页面指出:http: //msdn.microsoft.com/en-us/library/ms742806.aspx
功能定义:路由事件是一种事件类型,它可以在元素树中的多个侦听器上调用处理程序,而不仅仅是在引发事件的对象上。
从该功能定义看来,任何路由事件本质上都提供与附加事件相同的功能。因此,基本上附加事件实际上只是在静态类上声明路由事件的一种方式,并且与普通路由事件相比并没有真正提供任何好处。
让我知道你的想法,因为我可能在这里遗漏了一些东西。
谢谢,蒂姆瓦伦丁
c# - 如何对 CanExecuteRoutedEventHandler 进行单元测试?
我正在尝试为以下代码编写单元测试:
这段代码的问题是我无法创建 CanExecuteRoutedEventArgs 类型的模拟实例(密封类)或实例(内部构造函数)。
我尝试了以下方法,但以下代码均引发运行时异常。
感谢您的关注。
routedevent - 为什么我的隧道事件参数对象和冒泡事件参数对象不相等?
我正在阅读 70-511 这本书,并且正在查看有关 Routed Events 的部分。我注意到它提到冒泡隧道事件对共享相同的 EventArgs 实例,因此如果您处理隧道事件(例如 PreviewMouseDown),它会停止配对的冒泡事件(例如 MouseDown);我已经尝试过了,它可以工作......但是,如果我每次触发事件处理程序时测试是否相等(出于测试目的,我对两个事件都使用 1 个事件处理程序),似乎 EventArgs 不是同一个实例(即它们有不同的哈希值并且 Object.Equals 返回 false)...如果我能弄清楚为什么会这样,这将大大提高我对路由事件如何工作的理解!
有我们愿意解释的 .NET 专家吗?
我查看了 Pro WPF 书(优秀的书),这也只是说:“为了让生活更有趣,如果你将隧道事件标记为已处理,冒泡事件将不会发生。那是因为这两个事件共享RoutedEventArgs 类的相同实例。”
如果这两个事件共享一个类的相同实例,那么 eventargs 是否应该具有相同的哈希值并为 Object.Equals 返回“True”?
XAML:
c# - 获取 RoutedEvent Source 作为处理程序的孙子
我正在处理 WPF 应用程序中的用户输入,使用RoutedEvents
诸如MouseDown
等MouseMove
。我已经很好地掌握了MSDN 的 Routed Events Overview中的隧道和冒泡,但是我遇到了冒泡事件的问题。
当MouseDown
事件冒泡到处理程序时,MouseButtonEventArgs.Source
给我事件来自的当前元素的子元素。有没有办法抓住那个元素的孩子?我在想一些事情MouseButtonEventArgs.Source.Source
在这种情况下,我想将我的输入处理尽可能放在我的应用程序中,但仍然可以获得有关事件来自的初始元素的信息。
下面的一个例子:这里点击了Grid
命名的孙子,我想在Parent_MouseDown()
. 但是,在这种情况下,我得到的关于事件来源的所有信息都是关于grid
命名的 Child。有没有办法从父母那里获得有关孙子的信息?
请注意,此示例已简化,因为在我的应用程序中,这些元素属于不同的类,并且驻留在不同的文件中。提前致谢!
c# - 如何使用动态创建的子元素中的路由事件?
我的 MainWindow 中有一个事件作为路由事件从我的一个子控件中触发。MainWindow 有一个 AddHandler 调用来捕捉路由火灾。
我想从另一个子元素触发同样的事件,但是这个元素(一个 menuItem)是动态创建的,所以当我尝试在 MainWindow 中使用 AddHandler 时,比如:
我得到一个空参数异常,因为 MyMenuItem 还不存在。
有人知道我仍然可以使用路由事件的方法吗?