如何添加实现 C++ 接口的标签?

Posted

技术标签:

【中文标题】如何添加实现 C++ 接口的标签?【英文标题】:How to add a label that implements a c++ interface? 【发布时间】:2012-10-29 14:34:56 【问题描述】:

我的 C# 经验非常有限,所以也许这是一个常见的错误,但是,我在任何其他主题中都找不到答案。

在我的 WPF 应用程序中,我尝试创建一个标签,该标签继承自默认 WPF 标签并实现在 dll(托管 c++)中定义的接口。我的目标是将这个对象的一个​​实例传递给 c++ 代码,并让它在不使用单独线程的情况下更新 UI。

using System;
using System.Windows.Controls;
using System.Windows;

namespace WPFTest

    //my class : default WPF Label, C++ interface (dll)
    class ObservationResultLabel : Label, IObservationResult
    
        Boolean od;

        public Boolean ObjectIsDetected()
            return od;
        
        public void setObservationResult(Boolean od)
            this.od = od;
            this.Dispatcher.Invoke((Action)(() =>
            
                this.InvalidateVisual();
            ));
        
        protected override void  OnRender(
                System.Windows.Media.DrawingContext drawingContext)
            if (od)
                Visibility = Visibility.Visible;
            else
                Visibility = Visibility.Hidden;
            
            base.OnRender(drawingContext);
        
    

但是在尝试构建时,我得到一个“'ObservationResultLabel' 类型的值不能添加到'UIElementCollection' 类型的集合或字典中。”错误。如果我使用 C# 接口尝试相同的操作,则不会出错。

有人有什么建议吗?

【问题讨论】:

【参考方案1】:

开发 WPF GUI 的最简单方法是使用 Model-View-ViewModel pattern。将 WPF 元素传递到托管 C++ 库中只是为了更新它们的属性是我不建议这样做的。也不建议覆盖 OnRender()。我建议你看看一些 WPF 入门教程,例如this one。如果您打算使用 WPF 进行开发,则需要熟悉“WPF 思维方式”和 WPF 框架。

【讨论】:

【参考方案2】:

我认为可能是 C++ 托管接口正在使用 c# 或 WPF 无法使用的托管 C++ 语言功能,如果可以,请尝试将 [CLSCompliant] 属性添加到您的 c++ 接口,然后尝试编译并查看编译器说什么。我也会考虑@HighCore 所说的话。

【讨论】:

以上是关于如何添加实现 C++ 接口的标签?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建 Windows 共享库时如何实现接口隔离

如何在 C++ 共享库中隐藏业务对象的实现细节并提供接口

实现 COM 接口 C++ / VC++ 6.0 / MFC

如何使用 Visual Studio Express 2013 将 C# 接口实现/合并到一个简单的 C++ 程序中

Visual C++:接口的 ATL 实现

C++面向对象:C++ 数据抽象