C# 事件(event)

之前讲过了委托,要了解委托可以看之前讲委托的那一节https://www.jianshu.com/p/64416bc28d11

事件是对委托的一种封装。我们直接使用委托,要在外部向类的委托中添加方法,必须让委托实例公开,这个时候如果外部直接使用‘=’赋值,会覆盖之前添加的所有方法,只剩当前方法,影响到其他程序,委托也可以直接在类外部执行,影响其他部分。事件的优点就在与它只能使用‘+=’或‘-=’向委托中添加或删除方法,不能直接赋值,且事件只能在类的内部调用,外部只能订阅此事件,不能执行。

1.事件的定义

在定义一个事件前,我们要定义一个相应的委托类型,一般以EventHandler结尾。也可以使用程序集中预先定义好的委托,事件最常见的委托类型是EventHandler类型的委托,在System命名空间下,还有其他在控件中经常使用的SelectionChanged、TextChanged等。假定现在有一个自定义的颜色选择控件ColorSelector,选择改变后外部有关联的控件颜色要发生改变,我们可以自定义一个 ColorChanged委托。

public delegate void ColorChangedEventHandler(object sender, SelectionChangedEventArgs e);
public delegate void EventHandler(object sender, EventArgs e);
public delegate void SelectionChangedEventHandler(object sender, SelectionChangedEventArgs e);
public delegate void TextChangedEventHandler(object sender, TextChangedEventArgs e);

根据委托定义事件

public event  ColorChangedEventHandler  ColorChanged;
public event SelectionChangedEventHandler SelectionChanged;

2.内部事件定义及使用

在颜色选择控件内部有一个ComboBox,用来选择指定的几种颜色。定义一个颜色改变事件供关联的外部控件订阅。其实这种情况用SelectionChangedEventHandler就可以了,不过为了示例这里还是自定义一个委托。

public delegate void ColorChangedEventHandler(object sender, SelectionChangedEventArgs e);
public event  ColorChangedEventHandler  ColorChanged;   //颜色改变事件,供外部订阅

 private void CbColor_SelectionChanged(object sender, SelectionChangedEventArgs e) //ComboBox选中项改变事件
 {
        ColorChanged?.Invoke(sender,e);    //选中项改变时执行外部订阅事件
 }

3.外部订阅事件

外部其他控件在初始化或加载时订阅颜色改变事件。

       public Map()
        {
            InitializeComponent();
            colorSelector.ColorChanged += Color_ColorChanged;  
        }

        private void Color_ColorChanged(object sender, SelectionChangedEventArgs e)
        {
               this.Background = colorSelector.SelectedColor;//颜色选择控件颜色改变后处理代码
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 8,862评论 1 11
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,796评论 1 32
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 10,024评论 0 11
  • alert(a); function name(parameters) { alert(parameters); ...
    name阿喆azhe阅读 4,865评论 0 3
  • 一、理解事件事件采用发布/订阅模型,其中发行者决定在什么情况下引发事件,而订户决定为响应事件而执行的操作。事件可以...
    CarlDonitz阅读 2,338评论 0 0