C# 事件机制

C# 事件机制详解:从概念到实践

在 C# 中,事件机制是处理对象间通信的重要方式,尤其是在 GUI 应用程序(如 WPF、WinForms)中,事件用于响应用户交互(如按钮点击、鼠标移动等)。本文将详细讲解 C# 事件的概念、使用方法,并通过示例帮助你掌握事件机制。

目录

  1. 事件的基本概念
  2. 事件的使用步骤
  3. 事件处理程序的参数
  4. 自定义事件参数
  5. 取消事件订阅
  6. [WPF 中的事件机制](#WPF 中的事件机制)
  7. 示例代码
  8. 总结

1、事件的基本概念

事件 是对象发出的通知,表示发生了某些动作(如按钮点击、鼠标移动等)。事件机制基于发布-订阅模式

  • 发布者:定义事件并触发事件的对象。
  • 订阅者:订阅事件并处理事件的对象。

事件处理程序是响应事件的代码,通常是一个方法。当事件发生时,事件处理程序会被调用。

2、事件的使用步骤

步骤 1:定义事件

在类中使用 event 关键字定义事件。例如:

csharp 复制代码
public class MyButton
{
    // 定义一个事件
    public event EventHandler Click;

    // 触发事件的方法
    public void OnClick()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}

步骤 2:订阅事件

在需要使用事件的地方,订阅事件并指定事件处理程序。例如:

csharp 复制代码
MyButton button = new MyButton();

// 订阅事件
button.Click += Button_Click;

// 事件处理程序
private void Button_Click(object sender, EventArgs e)
{
    Console.WriteLine("按钮被点击了!");
}

步骤 3:触发事件

csharp 复制代码
button.OnClick(); // 触发 Click 事件

3、事件处理程序的参数

事件处理程序通常有两个参数:

sender:触发事件的对象(例如按钮)。
e:事件参数,包含与事件相关的数据(例如鼠标位置、键盘按键等)。

4、自定义事件参数

如果需要传递自定义数据,可以定义自定义事件参数类。例如:

csharp 复制代码
public class MyEventArgs : EventArgs
{
    public string Message { get; set; }

    public MyEventArgs(string message)
    {
        Message = message;
    }
}

5、取消事件订阅

如果不再需要处理事件,可以取消订阅事件。例如:

csharp 复制代码
button.Click -= Button_Click;

6、WPF中的事件机制

示例:按钮点击事件

XAML 文件:

csharp 复制代码
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="事件示例" Height="200" Width="300">
    <Grid>
        <Button Content="点击我" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click" />
    </Grid>
</Window>

C# 代码文件:

csharp 复制代码
using System;
using System.Windows;

namespace WpfAppEventTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public event EventHandler<MyEventArgs> CustomButtonClick; // 使用自定义事件参数
        public MainWindow()
        {
            InitializeComponent();

            // 初始化事件订阅
            CustomButtonClick += MainWindow_CustomButtonClick;
        }

        // 事件处理程序
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("按钮被点击了!");

            CustomButtonClick?.Invoke(this, new MyEventArgs("自定义事件参数"));
        }


        private void MainWindow_CustomButtonClick(object sender, MyEventArgs e)
        {
            // 处理事件
            MessageBox.Show(e.Message);
        }

    }
    
     public class MyEventArgs: EventArgs
	 {
    	public string Message { get; set; }

     	//带参构造方法
     	public MyEventArgs(string message)
     	{
         	Message = message;
     	}
 	}

}

7、示例代码

以下是一个完整的示例,展示如何在 C# 中定义、订阅和处理事件:

csharp 复制代码
using System;

namespace EventExample
{
    // 自定义事件参数
    public class MyEventArgs : EventArgs
    {
        public string Message { get; set; }

        public MyEventArgs(string message)
        {
            Message = message;
        }
    }

    // 发布者类
    public class MyButton
    {
        // 定义事件
        public event EventHandler<MyEventArgs> Click;

        // 触发事件的方法
        public void OnClick()
        {
            Click?.Invoke(this, new MyEventArgs("按钮被点击了!"));
        }
    }

    // 订阅者类
    class Program
    {
        static void Main(string[] args)
        {
            MyButton button = new MyButton();

            // 订阅事件
            button.Click += Button_Click;

            // 触发事件
            button.OnClick();
        }

        // 事件处理程序
        private static void Button_Click(object sender, MyEventArgs e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

8、总结

  • 事件是对象间通信的重要机制,用于处理特定动作的发生。
  • 定义事件:使用 event 关键字定义事件。
  • 订阅事件:使用 += 运算符订阅事件。
  • 处理事件:编写事件处理程序方法。
  • 触发事件:在适当的地方调用触发事件的方法。
  • 取消订阅:使用 -= 运算符取消订阅事件。
相关推荐
软件黑马王子38 分钟前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
闲猫41 分钟前
go orm GORM
开发语言·后端·golang
李白同学2 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
黑子哥呢?3 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农4 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿4 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
彳卸风4 小时前
Unable to parse timestamp value: “20250220135445“, expected format is
开发语言
dorabighead5 小时前
JavaScript 高级程序设计 读书笔记(第三章)
开发语言·javascript·ecmascript
风与沙的较量丶5 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言
水煮庄周鱼鱼5 小时前
C# 入门简介
开发语言·c#