在C#中将多个事件处理程序连接到一个事件的最佳方式
本文关键字:一个 事件 方式 最佳 连接 事件处理 程序 | 更新日期: 2023-09-27 18:25:36
我正在编写一个简单的加密程序。当我在第一个文本框中键入时,加密文本会使用textchanged事件动态显示在第二个文本框上。我还有一个加载关键文件的按钮。我的问题是,如果我先在文本框中键入内容,然后加载密钥文件,则不会调用加密处理程序,因为它已挂接到textchanged事件,我必须在第一个文本框中写入一些内容才能调用它。
为了解决这个问题,我将两个事件挂接到加载按钮的单击事件,一个是加载密钥文件,另一个是挂接到textchanged事件的事件。(我真的很想避免代码重复。)
这是正确的,但我怎么能确定,每次密钥文件加载发生并在调用加密函数之前完成?有更好的方法吗?
您应该考虑创建单独的方法:
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);
}
};