创建自定义wpf事件

dav*_*rtu 16 c# wpf events xaml custom-event

我创建了一个UserControl for Database连接,用户输入用户名和密码进行连接.此UserControl位于MainWindow.xaml中

现在,在我的UserControl后面的代码中,我创建了一个MSSQL连接.如果登录成功,我想提升自定义事件以在MainWindow中公开.

例如,在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);
}
Run Code Online (Sandbox Code Playgroud)

并在MainWindow.xaml我想使用mypersonalized事件:

<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>
Run Code Online (Sandbox Code Playgroud)

我需要这个用于多种类型的连接(MSSQL,Oracle,MySql等).

怎么弄这个?

Ana*_*ali 26

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

在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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

就是这样.您已定义了您的活动.

选项2

    public event Action<String> MyPersonalizedUCEvent;

    public void RaiseMyEvent()
    {
        // Your logic
        if (MyPersonalizedUCEvent != null)
        {
            MyPersonalizedUCEvent("sample parameter");
        }
    }
Run Code Online (Sandbox Code Playgroud)

有关该Action代表的更多信息,请参见此链接.

注意:

在许多情况下,如果事件未正确使用,可能会导致内存泄漏.只需确保您已编写代码以删除已注册的事件处理程序,如下所示.

        MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler;
Run Code Online (Sandbox Code Playgroud)

  • @davymartu但是,您通常会使用其中一个预定义的代理类型,而不是定义自己的委托类型,例如[EventHandler](http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx)或[EventHandler <T>](http://msdn.microsoft.com/en-us/library/db0etb8x.aspx). (6认同)

Mar*_*Alx 10

首先在班级中创建一个公共事件:

public event EventHandler<MyEventArgs> SomethingChanged;
Run Code Online (Sandbox Code Playgroud)

NB MyEventArgs是将事件与订阅者一起传递的对象类型.对于这个例子,它可能是这样的:

public class MyEventArgs{
    public String Prop1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

然后在你的课堂上解雇它:

SomethingChanged?.Invoke(this, new MyEventArgs() { Prop1="test" });
Run Code Online (Sandbox Code Playgroud)

最终处理它像这样:

private void OnSomethingChanged(object sender, MyEventArgs e)
{
    //TODO
}
Run Code Online (Sandbox Code Playgroud)

注意您需要订阅该事件才能输入该OnSometingChanged方法.订阅如下:

myClass.SomethingChanged+=OnSomethingChanged;
Run Code Online (Sandbox Code Playgroud)

哪里myClass是你定义类的一个实例SomethingChanged