内部では、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
}
}