无法以一种形式触发事件以另一种形式处理事件

时间:2019-08-14 17:08:40

标签: c# wpf vb.net events

我们有一个用VB.NET编写的较旧的WPF应用程序,它在C#中具有较新的项目。主应用程序(VB.NET)具有选项卡形式,可在单独的选项卡中显示新打开的用户控件。当前,对主选项卡形式的引用正在通过紧密耦合传递给其他项目。我们正在尝试删除此内容。

在这里我被困住了:

主应用程序具有一个名为AdminMain.xaml.vb的表单

我在这里添加了一个事件处理程序,如下所示:

Public Event OnOpenAccountOpeningPreviewEvent(accountOpeningPreview As AccountOpeningPreview)

事件处理程序本身看起来像这样:

Function OpenAccountOpeningPreview(accountOpeningPreview As AccountOpeningPreview)  Handles Me.OnOpenAccountOpeningPreviewEvent

    DIm oPreviewOnBoardingContentPane as ContentPane  = new ContentPane()
    Dim sPreviewOnBoardingName as string = "Preview OnBoarding Documents"

    oPreviewOnBoardingContentPane.Content = accountOpeningPreview

    oPreviewOnBoardingContentPane.Activate()

End Function

在AdminMain.xaml.vb用户控件的Loaded事件中,我正在这样做:

Dim accountOpening = new AccountOpening()

AddHandler accountOpening.OnOpenAccountOpeningPreviewEvent, New AccountOpening.AccountOpeningPreviewEventHandler(AddressOf OpenAccountOpeningPreview)

在一个单独的项目(C#)中,我有一个名为AccountOpening.xaml.cs的用户控件,该控件在选项卡中打开得很好,因为它是从主VB.NET应用程序实例化的。但是,AccountOpening.xaml.cs需要打开AccountOpeningPreview.xaml.cs,这是与AccountOpening在同一C#项目中的另一个C#用户控件。

在这里,我已经定义了这样的事件处理程序:

public delegate void AccountOpeningPreviewEventHandler(AccountOpeningPreview sender);
public event AccountOpeningPreviewEventHandler OnOpenAccountOpeningPreviewEvent;

并且启动AccountOpeningPreview用户控件时,执行此操作的代码如下:

AccountOpeningPreview accountOpeningPreview = new AccountOpeningPreview();
accountOpeningPreview.BOClientIdList = String.Join(",", BOClientIdList.ToArray());
accountOpeningPreview.FICode = _fi_code;
accountOpeningPreview.Visibility = Visibility.Visible;

if (OnOpenAccountOpeningPreviewEvent != null)
    OnOpenAccountOpeningPreviewEvent(accountOpeningPreview);

一个问题是OnOpenAccountOpeningPreviewEvent始终为null,无法触发将在AdminMain(VB.NET项目)中引发事件的事件调用

已经有一段时间了,因为我需要这样做,所以我可能错过了一些非常简单的东西。

关于我在做什么错的任何想法吗?

谢谢

卡尔

1 个答案:

答案 0 :(得分:0)

这是解决方案:

在主VB.NET应用程序中设置事件处理程序

Dim oViewControl As AccountOpening = New AccountOpening()

AddHandler oViewControl.Escalate, AddressOf OpenAccountOpeningPreview

并创建处理程序方法:

Function OpenAccountOpeningPreview(sender As Object,e As UCEventArgs) 

    DIm oPreviewOnBoardingContentPane as ContentPane  = new ContentPane()

    oPreviewOnBoardingContentPane.Name = "PreviewOnBoardingDocuments"
    oPreviewOnBoardingContentPane.TabHeader = "Preview OnBoarding Documents"
    oPreviewOnBoardingContentPane.AllowDocking = true
    oPreviewOnBoardingContentPane.AllowFloatingOnly = true
    oPreviewOnBoardingContentPane.AllowClose = true
    oPreviewOnBoardingContentPane.Content = e.UCReference
    oPreviewOnBoardingContentPane.TabHeaderTemplate = CType(Resources("TabTemplate"), DataTemplate)

    DockGroup.Items.Add(oPreviewOnBoardingContentPane) //Using Infragistics tab

    oPreviewOnBoardingContentPane.Visibility = Visibility.Visible
    oPreviewOnBoardingContentPane.Activate()

End Function

在C#项目中,使用如下EventArgs对象创建事件处理程序:

public class UCEventArgs : EventArgs
{
    public AccountOpeningPreview UCReference { get; set; }

    public UCEventArgs(AccountOpeningPreview reference)
    {
        UCReference = reference;
    }
}

public event EventHandler<UCEventArgs> Escalate;

protected virtual void OnEscalate(UCEventArgs e)
{
    var handler = Escalate;
    if (handler != null)
    {
        handler(this, e);
    }
}

然后,当用户按下按钮打开表单时,使用以下代码触发事件:

AccountOpeningPreview accountOpeningPreview = new AccountOpeningPreview();
accountOpeningPreview.BOClientIdList = String.Join(",", BOClientIdList.ToArray());
accountOpeningPreview.FICode = _fi_code;
accountOpeningPreview.Visibility = Visibility.Visible;

OnEscalate(new UCEventArgs(accountOpeningPreview));
相关问题