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