1

我的 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# 接口尝试相同的操作,则不会出现错误。

有人有什么建议吗?

4

2 回答 2

1

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

于 2012-10-29T22:45:32.997 回答
0

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

于 2012-10-29T22:47:58.300 回答