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 に答える