Tag: 事件

存储一个EventHandler列表以取消订阅

我有一个带有方法的类, Register使用标准的aClass.SomeEvent += the_handler来订阅它包含的类上的许多事件。 此类还有一个Unregister方法,使用-=取消订阅这些事件。 这很好但我们发现如果我们添加一个新事件来订阅它,很容易忘记在取消Unregister包含取消订阅。 这种维护事件订阅的手动方法被certificate是脆弱的。 有没有办法维护一个可以迭代和动态取消订阅的订阅列表? (并且在Unregister Register后调用Register时可能会迭代并重新订阅)。 一些细节:该类引用了其他3个类(当前,但不限于3),这些类上的各种事件都是EventHandler或EventHandler 。

在调用自定义事件之前,为什么要检查null?

这两个用于调用事件的代码示例有什么区别? 样品1 public void OnDataChanged() { if (DataChanged != null) { DataChanged(this); } } 样本2 DataChanged.Invoke(this); 我应该何时使用每种方法来调用自定义事件? 为什么有时我尝试使用DataChanged.Invoke(this)调用事件时会得到NullReferenceException,但是当我将事件调用转换为示例1中的方法时, DataChanged永远不会变为null?

C#:如何测试基本的线程工作者类

我正在考虑如何测试multithreading的东西,但不太确定如何开始。 我相信如果我能把事情搞定,我会更容易找到更多的东西,所以我想知道是否有人可以帮助我为这个简单的类编写一个NUnit测试用例: class Worker { public event EventHandler Done = (s, e) => { }; public void StartWork() { var thread = new Thread(Work) { Name = “Worker Thread” }; thread.Start(); } private void Work() { // Do some heavy lifting Thread.Sleep(500); Done(this, EventArgs.Empty); } } 我想测试的是: Done事件在Done时是否会被提升。 如果它是同步的话我会没有问题,但是当它不是时,我也不确定从哪里开始。 一个简单的测试,如果它不是multithreading的(并且Work方法不是私有的)可能是: [TestFixture] class WorkerTests { [Test] […]

如何通过Tab键及时启用WinForm按钮以获得焦点

Visual Studio 2010,C# 我有一个带DropDown的ComboBox , AutoComplete设置为SuggestAppend , AutoCompleteSource来自ListItems 。 用户将数据键入其中,直到具有正确的条目。 如果数据与列表项之一匹配,则combobox旁边的按钮被禁用。 如果用户点击Tab键,则自动完成function会接受当前建议。 它还会移动到启用的选项卡序列中的下一个控件。 当然,因为我希望它转到disbabled按钮,我需要在validation条目后立即启用它。 问题是我没有尝试过任何事件, PreviewKeyDown , LostFocus , SelectedIndexChanged允许我及时启用按钮以使其被处理并获得焦点。 它始终以Tab键顺序进入下一个按钮,该按钮始终处于启用状态。 我准备好让按钮保持启用状态,如果太快按下它就会出错,但我不想这样做。 我也不想进入特殊模式标志来跟踪这些控件何时获得焦点。 validation似乎是正常的事情,但我被困住了。 如果SelectedIndexChanged在用户进行匹配时起作用,则这很容易。 当盒子清除时,或者当找到类型匹配时,它不会触发。

注册到事件的命名方法

假设我有一个暴露以下事件的类: public event EventHandler Closing 应该如何命名注册到此事件的方法? 您是否更喜欢遵循Visual Studio在为其生成的方法指定名称时使用的约定(又名。+ =,Tab,Tab)? 例如: private void TheClass_Closing( object sender, EventArgs e ) 或者您使用自己的风格来命名这些方法? 我已经尝试了不同的方法来命名这些方法(如TheClassClosing , HandleClosing等)。 但我没有找到一个好的风格来表明方法的意图是处理已注册的事件。 我个人不喜欢Visual Studio用来生成方法名称的样式(下划线)。 我知道注册的事件处理方法总是私有的,并且没有像引发事件的方法那样的命名约定(例如, OnClosing )。

将事件附加到动态对象

我以下面的方式创建一个COM-Object的ac#动态对象: dynamic pdfCreator = Activator.CreateInstance( Type.GetTypeFromProgID(“PDFCreator.clsPDFCreator”)); clsPDFCreator类正在定义一个调用eReady的事件。 但是当我尝试注册一个类似的事件处理程序时 pdfCreator.eReady += _PDFCreator_eReady; 我收到错误消息“Operator’+ =’不能应用于’dynamic’和’method group’类型的操作数”。 如何将EventHandler注册到声明为动态对象的Event?

在Internet Explorer控件中禁用上下文菜单

如何禁用IE WebBrowser控件中的上下文菜单,而是在C#中执行右键单击事件的自定义处理?

F10钥匙没有被抓住

我有一个Windows.Form,并覆盖ProcessCmdKey。 但是,这适用于除F10之外的所有F键。 我正在尝试搜索当我在表单上按F10时未调用ProcessCmdKey的原因。 有人可以告诉我如何找到原因吗? 最诚挚的问候,托马斯

PreviewMouseMove与MouseMove

我已经获得了相当多的XAML经验,但最近我注意到我的大多数同事都使用了MouseMove事件的PreviewMouseMove 。 我一直使用MouseMove并且它很好用,但我不禁要问我应该何时使用PreviewMouseMove和MouseMove 。 有什么不同,每个人有什么利弊等等?

触发按钮单击代码

所以当点击“添加播放器”按钮时,我有以下代码 private void addPlayerBtn_Click_1(object sender, EventArgs e) { //Do some code } 我想从我的SDK中触发此代码。 这是我尝试过的 private void command() { addPlayerBtn_Click_1(object sender, EventArgs e); } 一旦我放入线路,我就会收到很多错误 addPlayerBtn_Click_1(object sender, EventArgs e) 有人可以告诉我如何编写代码,以便我可以通过在代码中写入来触发事件吗?