使用继承处理跨项目事件

Posted

技术标签:

【中文标题】使用继承处理跨项目事件【英文标题】:Handling events cross-project with Inheritance 【发布时间】:2012-04-25 11:44:10 【问题描述】:

我有 2 个项目; - 我的应用程序是用 C++ 编写的,其中一些项目文件设置为使用 /clr - 我的 C# WPF 控件库,其中包含一些表单

在 C++ 应用程序中,我从 C# dll 加载表单并在 STAThread 中显示它们,同时在后台运行一些其他本机内容。

我想在我的 C++ 应用程序中处理来自 C# 表单的表单事件。这是我启动表单的代码;

using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace MyProject::Interface::Views;

public ref class MyProjectApplication : public Application

;

[STAThread]
void ManagedMain()

    CLILicenseView^ winLicenseAgreement = gcnew CLILicenseView();

    MyProjectApplication^ MyProjectCLI = gcnew MyProjectApplication();
    MyProjectCLI->Run(winLicenseAgreement);

我的原始表单名为“License.xaml”,我尝试继承它并覆盖事件,因为我认为它可能有助于我处理事件,但我不知道我在做什么。

using namespace System;
using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace MyProject::Interface::Views;

namespace MyProject

    public class CLILicenseView : License
    
        public void CLILicenseView()
        
            //
        
    

这是最好的方法吗?如果不是,我如何处理来自 C++ 应用程序的表单事件(即:按钮点击)?

【问题讨论】:

这是托管 c++ 吗? (你谈论其他“本地”的东西) 是的,它将被管理。我的 C++ 项目中有一些本机文件,但它们与我遇到的问题无关,因为托管和本机部分是分开的。 License;将您的控件声明为protected 成员或在License 中创建protected virtual void 方法,这些方法在表单事件上引发(例如btnX.Click += OnBtnXClick; 其中OnBtnXClickprotected virtual void 中的protected virtual void 方法@),然后覆盖CLILicenseView中的方法。 @jberger 我似乎无法让它工作我得到 2 个与我的语法相关的错误,我无法找出问题所在。这是我试图做的代码来覆盖事件link 我通过添加一个 ; 来修复一个在我的课程结束时,但仍然有一个烦人的语法错误Error 1 error C2144: syntax error : 'MyProject::CLILicenseView' should be preceded by ':' 12 1 MyProject 【参考方案1】:

我认为组合在这里是正确的工具,而不是继承。在我从事的 C++/CLI 项目(只是一个类库,没有 UI)中,ref 类通常包含一个指向 C++ 业务逻辑的未管理指针。当用户想要与业务逻辑交互时,他们调用托管方法,然后通过指针调用非托管代码。在您的情况下,当表单想要与非托管代码进行交互时,它应该回调到MyProjectApplication,然后再调用您的非托管代码。

【讨论】:

以上是关于使用继承处理跨项目事件的主要内容,如果未能解决你的问题,请参考以下文章

请问C# Winform项目中子类的事件被触发时,怎么跨类更新UI。

使用 qt 中的事件将项目属性传递到主窗口

JavaScript中的事件对象

Java-全局跨域处理

跨多个模板将项目添加到 Bootstrap 导航栏

跨线程事件信号(Obj-C)的同步/等待设计?