Tag: 事件

如何实现可取消的事件?

在System.ComponentModel中,有一个名为CancelEventArgs的类,其中包含可在事件侦听器中设置的Cancel成员。 MSDN上的文档解释了如何使用它来从侦听器中取消事件,但是如何使用它来实现我自己的可取消事件? 有没有办法在每个侦听器触发后检查Cancel成员,或者我必须等到事件触发所有侦听器之后?

WPF:如何防止控件窃取关键手势?

在我的WPF应用程序中,我想将一个输入手势附加到命令,以便输入手势在主窗口中全局可用,无论哪个控件具有焦点。 在我的情况下,我想将Key.PageDown绑定到命令,但是,只要某些控件接收焦点(例如TextBox或TreeView控件),这些控件就会接收键事件并且不再触发命令。 这些控件没有定义特定的CommandBindings或InputBindings 。 这是我定义输入手势的方式: XAML: 码: using System; using System.Windows; using System.Windows.Input; public static class Commands { private static RoutedUICommand _myCommand; static Commands() { _myCommand = new RoutedUICommand(“My Command”, “My Command”, typeof(Commands), new InputGestureCollection() { new KeyGesture(Key.PageDown, ModifierKeys.None) }); } public static ICommand MyCommand { get { return _myCommand; } } } public partial […]

关于使用RFID进行C#线程的问题

我的问题是关于确保我采取正确方法并正确处理线程的反馈。 我有一种感觉,我可能需要设置一些自己的线程,所以欢迎所有反馈。 我遇到的问题是从零个或多个RFID阅读器读取RFID标签。 我可以在没有问题的情况下阅读单个读者,因此从几个读取不会是一个问题。 读者阅读的每个标签或批次标签都由.Net事件提供。 我的计划是设置一个ReaderControl类,它维护读者,连接,启动,停止等。这个类将听取读者的TagRead事件。 它处理的每个事件(大约每250毫秒)它将读取标记ID(一个字符串)放入一个HashSet以保持它们的唯一性,HashSet位于ReaderControl中。 ReaderControl将包含一个计时器,每500ms触发一次,这个TimerElapsed事件由ReaderControl处理,它将打包从目前为止从所有读取器读取的标签并引发TagsRead事件。 这样做的目的是将事件触发保持在最低限度并减少重复标记。 TagsReads事件由另一个名为TagTranslator的类处理。 这个类将遍历标记ids(字符串)并计算出标记引用的内容,即IPerson对象。 此课程将在完成翻译时使用PeopleSeen事件触发事件。 PeopleSeen事件由GUI中的模型(MVP模式)处理。 总体思路是GUI显示屏显示通过RFID阅读器的人的名字。 显示器很简单,但显然在引擎盖标签正在asych中读取并被转换为“真实”对象以进行显示。 你认为ReaderControl应该在自己的线程上运行,我认为它应该。 我如何在自己的线程中打包这个类,无论GUI在做什么,都只是继续阅读标签。 另外,您认为TagTranslator在处理事件时应该创建线程来处理翻译。

Wpf事件没有冒泡

这是我的XAML: 这是C#代码: namespace WpfApplication4 { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { protected int eventCounter = 0; public MainWindow() { InitializeComponent(); } private void somethingClicked(object sender, RoutedEventArgs e) { eventCounter++; String message = “#” + eventCounter.ToString() + “:\r\n” + ” Sender: ” + sender.ToString() + “:\r\n” + ” […]

事件源vs原始源

我正在阅读C#WPF书籍,在路由事件章节中,事件有2个相同的属性Source和OriginalSource 。 我没有看到它们之间的区别: XAML: 代码背后: private void Ok_Click(object sender, RoutedEventArgs e) { bool flag = false; var source = e.Source; var originalSource = e.OriginalSource; if (source == originalSource) { flag = true; } } 和flag属性在这里是true ,有人可以解释为什么2相同的属性或在这种情况下这个属性没有效果? 或者我们在哪里可以看到这个属性的用例?

非委托类型的事件

我已经实现了一个看起来像这个接口的类: [ImmutableObject(true)] public interface ICustomEvent { void Invoke(object sender, EventArgs e); ICustomEvent Combine(EventHandler handler); ICustomEvent Remove(EventHandler handler); ICustomEvent Combine(ICustomEvent other); ICustomEvent Remove(ICustomEvent other); } 此CustomEvent类的工作方式与MulticastDelegate非常相似。 它可以调用。 它可以与另一个CustomEvent结合使用。 并且可以从另一个CustomEvent中删除CustomEvent。 现在,我想声明一个这样的类: class EventProvider { public event CustomEvent MyEvent; private void OnMyEvent() { var myEvent = this.MyEvent; if (myEvent != null) myEvent.Invoke(this, EventArgs.Empty); } } 不幸的是,这段代码无法编译。 出现编译器错误CS0066: ‘EventProvider.MyEvent’:事件必须是委托类型 […]

通过reflection为任何事件类型订阅操作

考虑: someControl.Click += delegate { Foo(); }; 事件的论点是无关紧要的,我不需要它们,我对它们不感兴趣。 我只想让Foo()被调用。 通过reflection没有明显的方法来做同样的事情。 我想将上述内容翻译成类似的内容 void Foo() { /* launch missiles etc */ } void Bar(object obj, EventInfo info) { Action callFoo = Foo; info.AddEventHandler(obj, callFoo); } 此外,我不想假设传递给Bar的对象类型严格遵守使用事件的EventHander(TArgs)签名的指导原则。 简单地说,我正在寻找一种方法来将Action订阅到任何处理程序类型; 简而言之,一种将Action委托转换为预期处理程序类型的委托的方法。

区分用户交互引发的事件和我自己的代码

在以下情况下,从combobox中在我的应用程序中触发SelectedIndexChanged事件: 用户在combobox中选择不同的项目,或者在以下情况下: 我自己的代码更新了combobox的SelectedItem以反映combobox现在显示不同对象的属性。 我对case 1的SelectedIndexChanged事件感兴趣,这样我就可以更新当前对象的属性。 但是在第2种情况下,我不希望事件触发,因为对象的属性没有改变。 一个例子可能有帮助。 让我们考虑一下,我有一个包含人员列表的列表框,我有一个combobox,表示列表中当前所选人员的国籍。 如果Fred目前在列表中被选中,则可能发生案例1,并且我使用combobox将他的国籍从英语更改为威尔士语。 如果我在列表中选择苏格兰人Bob,则可能发生案例2。 在这里,我的列表更新事件处理程序代码看到Bob现在被选中,并更新combobox,以便苏格兰语现在是所选项目。 这会导致combobox的SelectedIndexChanged事件被触发以将Bob的国籍设置为苏格兰语,即使它已经是苏格兰语。 如何在不导致SelectedIndexChanged事件触发的情况下更新我的combobox的SelectedItem属性? 一种方法是取消注册事件处理程序,设置SelectedItem ,然后重新注册事件处理程序,但这似乎很乏味且容易出错。 肯定有更好的办法。

C#simple Event Raising – 使用“sender”与自定义EventArgs

考虑这种情况。 我有一个对象,让我们称它为…… Foo。 Foo引发了一个名为“Loaded”的简单事件。 作为活动信息的一部分,消费者需要知道哪个foo对象引发了该事件。 我们的团队采用了以下模式。 1)创建一个inheritance自EventArgs的新类 – 例如,FooEventArgs:System.EventArgs。 2)将类型为Foo的属性添加到FooEventArgs中,该属性通过构造函数传入来设置。 3)使用EventHandler的通用版本声明事件,所以 public event EventHandler Loaded; 4)使用以下签名从Foo类提升事件: Loaded(this, new FooEventArgs(this)); 本质上它的作用是使“发送者”成为foo对象,但它也将foo对象引用作为强类型属性放入事件参数中。 这样做的一个优点是,当他们处理事件时,没有人必须打扰“发送者”,这降低了事件消费者和事件提升者之间的耦合。 另一个“优点”是,如果事件提升者的类型必须改变,因此强类型属性(希望永远不会发生),那么当它出现为null时,不是简单地让代码开始失败, API实际上已经破解,因此可以在编译时修复。 对我来说,这种模式似乎有点矫枉过正。 他们应该更多地信任“sender”参数,并放弃自定义事件参数吗? 我的团队认为没有人真正使用sender参数。 传递对事件提升对象的引用的最佳实践是什么? 编辑:到目前为止很棒的反馈,我会在接受之前将其打开一天左右。

Windows窗体事件“在选择选项卡上”?

我正在用C#构建一个Windows窗体应用程序。 如何选择选项卡菜单上的某个选项卡时,如何触发代码?