在C#中将多个事件处理程序连接到一个事件的最佳方式

本文关键字:一个 事件 方式 最佳 连接 事件处理 程序 | 更新日期: 2023-09-27 18:25:36

我正在编写一个简单的加密程序。当我在第一个文本框中键入时,加密文本会使用textchanged事件动态显示在第二个文本框上。我还有一个加载关键文件的按钮。我的问题是,如果我先在文本框中键入内容,然后加载密钥文件,则不会调用加密处理程序,因为它已挂接到textchanged事件,我必须在第一个文本框中写入一些内容才能调用它。

为了解决这个问题,我将两个事件挂接到加载按钮的单击事件,一个是加载密钥文件,另一个是挂接到textchanged事件的事件。(我真的很想避免代码重复。)

这是正确的,但我怎么能确定,每次密钥文件加载发生并在调用加密函数之前完成?有更好的方法吗?

在C#中将多个事件处理程序连接到一个事件的最佳方式

您应该考虑创建单独的方法:

private List<string> keyCodes;
private void LoadKeyCodesButton_Click(object sender, RoutedEventArgs e)
{
    LoadKeyCodes();
    UpdateOutput();
}
private void InputTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    UpdateOutput();
}
private void LoadKeyCodes()
{
    // load key codes here
    keyCodes = new List<string>();
    // etc.
}
private void UpdateOutput()
{
    OutputTextBox.Text = EncryptText(InputTextBox.Text);
}
private string EncryptText(string input)
{
    // use keyCodes to encrypt
    return input;
}

加密甚至可以放在一个单独的类中,但这将有助于您入门。

看起来您正在尝试将事件链接起来。这可以通过从KeyFilesLoadedEvent(或它们的名称)调用TextChangedEvent来完成

public event TextChangedEventHandler TextChangedEvent;
public event KeyFilesLoadedEventHandler KeyFilesLoadedEvent;
KeyFilesLoadedEvent += (sender, e) =>
{
    /* the rest of your code for the KeyLoadedEvent  */
    TextChangedEventHandler handler = TextChangedEvent;
    if(handler != null)
    {
        handler(this, e);
    }
};