0

MainWindow にMy WPF App という問題があります。

public partial class MainWindow : Window, ICallbackNotify

この「 ICallbackNotify 」は、MapInfo COMと通信し、 UI と MapInfo の間の対話性を確保するためのものです。

public interface ICallbackNotify : ISynchronizeInvoke
{
    // Method called by MapInfoCallback class when user chooses custom OLE menuitem 
    void OnMenuItemClick(uint id);

    // Method called by MapInfoCallback class when the status bar text changes 
    void OnStatusBarTextChanged(string text);

    // Method called by MapInfoCallback class when window changes
    void OnWindowContentsChanged(uint windowId);
}

問題は、このコードがWindows Fromで正常に機能していることですが、WPFに入れるとエラーメッセージが表示されることです。

Error   1   'WpfApplication3.MainWindow' does not implement interface member 'System.ComponentModel.ISynchronizeInvoke.InvokeRequired'  c:\users\dragon\documents\visual studio 2010\Projects\WpfApplication3\WpfApplication3\MainWindow.xaml.cs    25  26  WpfApplication3

この問題を解決する理由や方法がわかりません

4

1 に答える 1

2

内部では、Windows フォームと WPF は大きく異なります。

ISynchronizeInvoke は、Win32 API に基づいて構築された Windows フォームの概念であり、WPF には適用されません。WPF では、スレッド間の通信に Dispatcher を使用します。

あなたの質問から、あなたがやりたいことは、WPF アプリケーション内で WinForms COM コントロールをホストすることのように思えます。これら 2 つのテクノロジを橋渡しするために、Microsoft には、コンポーネントを含めるために使用できる WindowsFormHost コントロールがあります。 このブログ投稿には、それに関するかなり良い記事があります。この MSDN の例を確認してください: https://msdn.microsoft.com/en-us/library/vstudio/ms751761(v=vs.100).aspx


アップデート:

あなたが抱えている問題は実行時ではなく、コンパイル中にあるようです?? 落ち着いて明確にしましょう。

Windows フォームでは、すべてのユーザー コントロールとウィンドウが ISynchronizeInvoke を実装します。WPF は従来の Win32 WinProc メッセージ ポンプに基づいて構築されていないため、このインターフェイスを実装していません。INotifyCallBack インターフェイスと実装を「そのまま」コピーしてMainWindow.xaml.cs に貼り付ける、基本インターフェイス ISynchronizeInvoke がそのクラスに実装されていないため、コンパイル エラーが発生します。コンパイル エラーを回避するには、ISynchronizeInvoke シグネチャを実装する必要があります。

public partial class MainWindow : Window, ISynchronizeInvoke
{
   public IAsyncResult BeginInvoke(Delegate method, object[] args)
   {
      throw new NotImplementedException();
   }
   public object EndInvoke(IAsyncResult result)
   {
      throw new NotImplementedException();
   }
   public object Invoke(Delegate method, object[] args)
   {
      throw new NotImplementedException();
   }
   public bool InvokeRequired
   {
      throw new NotImplementedException();
   }
}

しかし、何だと思いますか?これを行う場合、ISynchronizeInvokeと WPF Dispatcher の間の適切なマッピングを提供するのはあなた次第です。 だから、これをしないでください!上記のコードはコンパイルできる可能性がありますが、正しく動作しない (またはまったく動作しない) 可能性があります。

代わりに、Microsoft が提供する Windows Form Integration 機能を使用して、WindowsFormHost コントロール内でコントロールをホストします。INotifyCallback にカスタム コードを実装する必要があるため、そのコードをカスタム Windows フォーム ユーザー コントロールに配置する必要があります。

とはいえ、上記の記事で提供されている指示に従う必要があります。

  • 参照System.Windows.Forms.dllおよびWindowsFormsIntegration.dll
  • 適切な名前空間を MainWindow.xaml に追加します
  • WindowsFormsHostをコンテナーとして MainWindow.xamlに追加し、その中にカスタム コントロールを配置します。

したがって、ICallbackNotify の実装を WPF MainWindow に配置する代わりに、標準の Windows フォーム UserControl に配置します。

namespace YourProject {
   using System.ComponentModel;
   using System.Windows.Forms;

   public class MyCustomMapControl : UserControl, ICallbackNotify
   {
       // your custom code goes here
   }
}
于 2011-07-20T16:27:35.900 に答える