我的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#接口尝试相同的事情,那就没有错误。
有没有人有任何建议?
答案 0 :(得分:1)
开发WPF GUI的最简单方法是使用Model-View-ViewModel 模式。我建议不要将WPF元素传递给托管C ++库以更新其属性。也不建议覆盖OnRender()。我建议你看看一些WPF入门教程,例如this one。如果您要在WPF中进行开发,则需要熟悉“WPF思维方式”和WPF框架。
答案 1 :(得分:0)
我认为可能是C ++托管接口使用了c#或WPF无法使用的托管C ++语言功能,如果可以的话,尝试将[CLSCompliant]属性添加到c ++接口然后尝试编译并看看编译器说的是什么。我会考虑@HighCore所说的内容。