创建自定义 wpf 事件
本文关键字:事件 wpf 自定义 创建 | 更新日期: 2023-09-27 17:55:50
我创建了一个用于数据库连接的用户控件,用户在其中输入连接的用户名和密码。此用户控件位于 MainWindow.xaml 中
现在,在我的用户控件的代码隐藏中,我创建了一个 MSSQL 连接。如果登录成功,我想引发一个自定义事件以在主窗口中公开。
例如在MyUserControl.xaml中.cs
try
{
using (SqlConnection sqlConn = new SqlConnection(connection))
{
sqlConn.Open();
MessageBox.Show("Connessione Riuscita!", "Connessione a " + TextIP.Text, MessageBoxButton.OK, MessageBoxImage.Information);
RaiseMyEvent();
sqlConn.Close();
}
}
catch (SqlException ex)
{
MessageBox.Show("Connessione Fallita: " + ex.Message, "Connessione a " + TextIP.Text, MessageBoxButton.OK, MessageBoxImage.Error);
}
在 MainWindow.xaml 中,我想使用 mypersonalinging:
<Window x:Class="XLogin.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:XLogin" WindowStartupLocation="CenterScreen">
<Grid>
<local:DBLogin x:Name="DBLoginFrame" MyPersonalizedUCEvent="DBLoginFrame_MyPersonalizedUCEvent"/>
</Grid>
</Window>
我需要这个进行多类型连接(MSSQL,Oracle,MySql等)。
怎么得到这个?
首先,您应该定义一个委托,然后使用该委托来定义该事件。
在 MyUserControl.xaml .cs 文件中,添加以下内容
选项 1
public delegate void MyPersonalizedUCEventHandler(string sampleParam);
public event MyPersonalizedUCEventHandler MyPersonalizedUCEvent;
public void RaiseMyEvent()
{
// Your logic
if (MyPersonalizedUCEvent != null)
{
MyPersonalizedUCEvent("sample parameter");
}
}
仅此而已。您已经定义了您的事件。
选项 2
public event Action<String> MyPersonalizedUCEvent;
public void RaiseMyEvent()
{
// Your logic
if (MyPersonalizedUCEvent != null)
{
MyPersonalizedUCEvent("sample parameter");
}
}
有关Action
代表的更多信息,请参阅此链接。
注意:
在许多情况下,如果事件未正确使用,则可能导致内存泄漏。只需确保已编写代码来删除已注册的事件处理程序,如下所示。
MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler;
首先在类中创建一个公共事件:
public event EventHandler<MyEventArgs> SomethingChanged;
NB MyEventArgs
是将与事件一起传递给订阅者的对象类型。对于此示例,它可以是这样的:
public class MyEventArgs{
public String Prop1 {get; set;}
}
接下来在你的班级中按原样触发它:
SomethingChanged?.Invoke(this, new MyEventArgs() { Prop1="test" });
芬尼像这样处理它:
private void OnSomethingChanged(object sender, MyEventArgs e)
{
//TODO
}
注意 您需要订阅事件才能输入OnSometingChanged
方法。像这样订阅:
myClass.SomethingChanged+=OnSomethingChanged;
其中myClass
是定义SomethingChanged
的类的实例