Под капотом Windows Forms и WPF очень разные.
ISynchronizeInvoke - это концепция Windows Form, основанная на Win32 API, которая не применяется к WPF. В WPF мы используем Dispatcher для связи между потоками.
По вашему вопросу звучит так, будто вы хотите разместить COM-элемент управления WinForms в приложении WPF. Чтобы соединить эти две технологии, у Microsoft есть элемент управления WindowsFormHost, который вы можете использовать для хранения своего компонента. В этом посте блога есть довольно хорошая запись об этом. Оформить пример MSDN: https://msdn.microsoft.com/en-us/library/vstudio/ms751761(v=vs.100).aspx
Обновление:
Звучит так, как будто у вас проблема не во время выполнения, а во время компиляции ?? Пусть помедленнее и будет ясно:
В Windows Forms все пользовательские элементы управления и окна реализуют ISynchronizeInvoke. WPF не построен на традиционном Win32c-обработчике сообщений Win32, поэтому они не реализуют этот интерфейс. Если вы скопируете и вставите свой интерфейс 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. Так что не делайте этого! Приведенный выше код может скомпилироваться, но, скорее всего, он не будет работать правильно (или вообще не будет).
Вместо этого используйте возможности интеграции форм Windows, предоставленные Microsoft, для размещения вашего элемента управления внутри элемента управления WindowsFormHost. Поскольку вам необходимо внедрить пользовательский код в свой INotifyCallback, вам нужно поместить этот код в пользовательский элемент управления пользовательских окон .
.
Все сказано, вам нужно следовать указаниям, указанным в статье, указанной выше:
- Ссылка System.Windows.Forms.dll и WindowsFormsIntegration.dll
- Добавьте соответствующие пространства имен в свой MainWindow.xaml
- Добавьте WindowsFormsHost в качестве контейнера в свой MainWindow.xaml, а затем поместите в него свой собственный элемент управления.
Таким образом, вместо того, чтобы поместить реализацию ICallbackNotify в главное окно WPF, поместите ее в стандартный пользовательский элемент управления Windows Form:
namespace YourProject {
using System.ComponentModel;
using System.Windows.Forms;
public class MyCustomMapControl : UserControl, ICallbackNotify
{
// your custom code goes here
}
}