我们有一个用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项目)中引发事件的事件调用
已经有一段时间了,因为我需要这样做,所以我可能错过了一些非常简单的东西。
关于我在做什么错的任何想法吗?
谢谢
卡尔
答案 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));