创建自定义 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等)。

怎么得到这个?

创建自定义 wpf 事件

首先,您应该定义一个委托,然后使用该委托来定义该事件。

在 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的类的实例