C#自定义事件及用法实例

yizhihongxing

C#自定义事件及用法实例

在C#编程中,事件是编写高效程序不可缺少的一个重要部分。在C#中,可以使用内置的事件(System.EventHandler)来对事件进行处理。同时,也可以使用自定义的事件来实现特定要求的事件处理。

本文将详细介绍C#自定义事件及用法实例,帮助读者更好地理解事件机制并掌握自定义事件的应用。

什么是C#自定义事件

自定义事件是基于内置事件机制,通过编写自定义事件处理程序来实现的一种事件处理方式。其中,自定义事件处理程序是通过自定义事件的类来创建的。自定义事件可以与内置事件机制一样,具有触发器和处理程序两个重要的组成部分。

public class CustomEventArgs : EventArgs
{
    public string FileName { get; set; }
}

定义自定义事件处理程序的类需要从 EventArgs 类继承,并在类中

public class FileWatcher
{
    public event EventHandler<CustomEventArgs> FileChanged;

    protected virtual void OnFileChanged(CustomEventArgs e)
    {
        FileChanged?.Invoke(this, e);
    }

    public void Watch(string directoryPath)
    {
        var watcher = new FileSystemWatcher(directoryPath);
        watcher.Changed += (sender, e) => OnFileChanged(new CustomEventArgs { FileName = e.Name });
        watcher.EnableRaisingEvents = true;
    }
}

通过在自定义事件的类中定义委托(EventHanlder)和事件来建立自定义事件。这里FileChanged即为一个自定义事件,其委托类型为 EventHandler<CustomEventArgs>,通过定义事件的触发方法OnFileChanged来激活该事件。触发 FileChanged 事件时传递 CustomEventArgs 参数来允许事件处理程序运行时处理特定的数据。

在 Watcher 方法中创建 FileSystemWatcher 对象,将要监视的目录路径传到它的构造函数中,并使用 FileSystemWatcher 的 Events 属性来注册 Changed 事件的事件处理程序,以便能在文件改变时触发自定义事件。

利用 FileWatcher 类,我们可以在指定目录下监控文件变化,然后根据 The event that is triggered upon a file delete 的需求,定义一个委托来创建一个事件处理程序,并将其注册到 FileWatcher 的自定义事件上

static void Main(string[] args)
{
    var fileWatcher = new FileWatcher();
    fileWatcher.FileChanged += OnFileChanged;
    fileWatcher.Watch(@"C:\Users\jacob\Desktop\Test");
    Console.ReadLine();
}

private static void OnFileChanged(object sender, CustomEventArgs e)
{
    Console.WriteLine($"File [{e.FileName}] was changed!");
}

实例1:自定义事件处理文件剪切函数

public class FileManager
{
    public event EventHandler<FileChangeEventArgs> FileChanged;
    public event EventHandler<FileChangeEventArgs> FileCopied;

    public void Cut(string origin, string destination)
    {
        File.Move(origin, destination);
        OnFileChanged(FileChangeType.Move, origin, destination);
    }

    protected virtual void OnFileChanged(FileChangeType type, string oldPath, string newPath)
    {
        if(FileChanged != null) 
        {
            FileChanged(this, new FileChangeEventArgs(type, oldPath, newPath));
        }
    }

    public void Copy(string origin, string destination)
    {
        File.Copy(origin, destination);
        OnFileCopied(FileChangeType.Copy, origin, destination);
    }

    protected virtual void OnFileCopied(FileChangeType type, string oldPath, string newPath)
    {
        if (FileCopied != null)
        {
            FileCopied(this, new FileChangeEventArgs(type, oldPath, newPath));
        }
    }
}

public class FileChangeEventArgs : EventArgs
{
    public FileChangeType Type { get; }
    public string OldPath { get; }
    public string NewPath { get; }

    public FileChangeEventArgs(FileChangeType type, string oldPath, string newPath)
    {
        Type = type;
        OldPath = oldPath;
        NewPath = newPath;
    }
}

public enum FileChangeType
{
    Move,
    Copy
}

public class Test
{
    static void Main(string[] args)
    {
        var fileManager = new FileManager();
        fileManager.FileChanged += OnFileChanged;
        fileManager.FileCopied += OnFileCopied;
        fileManager.Cut(@"C:\Users\jacob\Desktop\Test\Test.txt", @"C:\Users\jacob\Desktop\Test\New\Test.txt");
        fileManager.Copy(@"C:\Users\jacob\Desktop\Test\Test2.txt", @"C:\Users\jacob\Desktop\Test\New\Test2.txt");
        Console.ReadLine();
    }

    private static void OnFileChanged(object sender, FileChangeEventArgs e)
    {
        Console.WriteLine($"File [{e.OldPath}] was {e.Type.ToString().ToLower()}d to [{e.NewPath}]");
    }

    private static void OnFileCopied(object sender, FileChangeEventArgs e)
    {
        Console.WriteLine($"File [{e.OldPath}] was {e.Type.ToString().ToLower()}ied to [{e.NewPath}]");
    }
}

实例2:事件的发起者和接受者

  • 事件发起者
public class Button
{
    public event EventHandler Click;

    public void ClickButton()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}
  • 事件接受者
public class Window
{
    private readonly Button _button;

    public Window()
    {
        _button = new Button();
        _button.Click += OnButtonClick;
    }

    private void OnButtonClick(object sender, EventArgs e)
    {
        Console.WriteLine("Button clicked!");
    }
}

Window 类中使用事件发起者 Button,让程序可以在按钮单击时调用与该事件相关联的回调方法。当单击按钮时,触发 Click 事件(利用事件触发器Click?.Invoke(this, EventArgs.Empty);),该事件会通知所有被注册的监听器,事件接收者 Window 中的 OnButtonClick 方法就是其中的一个监听器,用来处理事件处理程序中定义的业务逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#自定义事件及用法实例 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C#中的checksum计算公式

    接下来我将为您详细讲解C#中的checksum计算公式的完整攻略。在计算checksum时,我们通常使用简单的数学算法。具体而言,我们通过将所有字节加起来并对其取模来计算checksum值。因为checksum值的计算方式相对简单,因此我们可以通过自己编写算法来计算checksum值。 以下为C#中的checksum计算公式示例: byte[] bytes …

    C# 2023年6月8日
    00
  • C# winform跨线程操作控件的实现

    下面是详细的“C# winform跨线程操作控件的实现”的攻略: 1. 前言 在多线程编程过程中,经常会遇到需求需要在子线程中控制 UI 界面,这时就需要用到跨线程操作控件。在使用 C# 的 WinForm 编程时,我们可以使用 Invoke() 或 BeginInvoke() 方法来实现跨线程操作控件。 2. Invoke() 和 BeginInvoke(…

    C# 2023年5月15日
    00
  • ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法

    ASP.NET输出PNG图片时出现GDI+一般性错误,通常表示出现了一些问题导致服务器无法正常处理图像。以下是解决该问题的完整攻略: 1. 了解GDI+错误 首先,我们需要了解GDI+错误是什么,以及为什么会出现。GDI+是Windows平台下的一种图像库,ASP.NET使用GDI+来生成和处理图像。当出现GDI+错误时,通常会伴随着一些错误消息,如“一般性…

    C# 2023年6月6日
    00
  • IIS6.0出错脚本引擎异常处理方法

    我来详细讲解一下“IIS6.0出错脚本引擎异常处理方法”的完整攻略。 问题描述 在使用IIS6.0时,有时候会出现脚本引擎异常的情况,这时候我们需要进行异常处理。 解决方法 首先,我们需要在IIS控制台中设置”Send Errors to Browser”为”True”,这样在运行时会在浏览器上显示具体的错误信息,方便我们进行调试。 针对不同的异常类型,我们…

    C# 2023年5月15日
    00
  • 在ASP.NET 2.0中操作数据之六:编程设置ObjectDataSource的参数值

    操作数据是Web应用程序中最常见的任务之一。在ASP.NET 2.0之后,为了简化设置数据源和处理数据的任务,可以使用ObjectDataSource控件。本攻略将详细讲解如何编程设置ObjectDataSource的参数值。 什么是ObjectDataSource ObjectDataSource是ASP.NET用于极度简化数据访问代码的控件之一。利用Ob…

    C# 2023年5月31日
    00
  • C# 常用公共方法

    C#常用公共方法 什么是C#常用公共方法? 在C#中,公共方法是可以被所有对象访问的方法,这些方法一般是在.NET基础类库(BCL)中定义的。它们为开发人员提供了在应用程序中处理常见操作和函数的方便方法。在实际的编程过程中,开发人员可以调用这些公共方法,并且不需要重新实现一个新的方法来满足自己的需求。 C#常用公共方法列表 下面是C#中常用的公共方法列表: …

    C# 2023年5月15日
    00
  • CPF 使用C#的Native AOT 发布程序的详细过程

    下面我将为你详细讲解如何使用C#的Native AOT发布程序。我们可以分为以下几个步骤来完成该过程: 安装必要的工具和组件 编写C#代码,确保它可以编译 使用AOT(Ahead Of Time)编译器生成本机代码 打包本机代码和必要的依赖文件 测试和发布应用程序 接下来,我将提交示例,以更好地演示这个过程。 步骤一:安装必要的工具和组件 首先,我们需要在开…

    C# 2023年5月15日
    00
  • Unity3D基于陀螺仪实现VR相机功能

    Unity3D基于陀螺仪实现VR相机功能 – 完整攻略 在Unity3D引擎中,使用陀螺仪可以非常方便地实现VR相机功能,这样可以让我们更好地体验VR游戏或应用。 步骤一:创建一个空项目 在Unity3D中创建一个新项目,选择3D项目。如果你已经有现成的项目,可以直接打开该项目。 步骤二:安装VR支持 在Unity3D中,可以使用VR支持使应用程序支持VR。…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部