在本机互操作中控制 WPF

Posted

技术标签:

【中文标题】在本机互操作中控制 WPF【英文标题】:Controlling WPF in native interop 【发布时间】:2011-06-10 18:23:23 【问题描述】:

我正在用本机代码编写应用程序,并希望将 WPF 用于用户界面库。现在,我已经相对容易地降低了互操作性,但最终,我正在尝试编写一个以 WPF 作为库的本机应用程序,而不是具有一些本机扩展的 WPF 应用程序。也就是说,我正在寻找一种具有某些品质的互操作解决方案,我似乎在任何示例中都找不到。

首先,我肯定想编写自己的主循环。我可能会在本机代码中执行任意操作,并且我希望能够轮询,例如,在每次迭代中。我的应用程序绝对不是“在您点击某些东西之前一直休眠”的应用程序。

其次,我想要控制 WPF 的能力。我想说的是 WPF 何时处理输入。我想说什么时候渲染。当我这么说的时候,我想让它让我成为一个 sammich。这是我遇到的更大问题之一。当然这些方法必须存在于 WPF 中,它们只是没有暴露在我能找到它们的任何地方。

我一直在研究 CLR 托管,但它似乎没有一种我正在寻找的“直到完成”的东西。即使我破解了关键部分或其他东西,即使是托管代码也无法让 WPF 做你想做的事。

【问题讨论】:

您是否考虑过将您的 WPF GUI 放入 winform 控件并使用最新的 ActiveX 控件? 【参考方案1】:

如果我正确理解您的问题,听起来您想为 WPF 编写自己的主循环/消息泵。我记得不久前在一个消息线程中读到了这个。这不是一个完整的答案,但我想知道它是否可以为您指明正确的方向。

主题:WPF 中的游戏循环? 想知道在 WPF 框架中编写自定义“游戏循环”是多么容易。通过游戏循环,我的意思是在自定义 Dispatcher 上发送我自己的事件,以便我可以控制我的应用程序的帧速率。

回答: 您可以编写自己的消息泵。只是不要调用 Dispatcher.Run。您需要泵送消息,并且需要酌情调用 ComponentDispatcher.RaiseThreadMessage。使用反射器查看 Dispatcher.PushFrame 的作用。

当然,这可能仍然无法为您提供您想要的“游戏循环”...

来源:http://blogs.msdn.com/b/jaimer/archive/2009/06/29/wpf-discussions-090626.aspx

【讨论】:

【参考方案2】:

我想你想看看HwndSource。它将 WPF GUI 作为 win32 控件托管。虽然这有点棘手,但您最好编写一个普通的 WPF .net GUI 应用程序并使用它来使用某种形式的互操作来驱动您的本机代码。 MS 真的没有想到这种迁移方法(重用您现有的代码并在顶部添加新的 GUI)宁愿让我们都重写所有代码。

网络上有很多例子。祝你好运。

PS。 当然,您可以在本机 GUI 中尝试当前的“黄金标准”-Qt。

【讨论】:

以上是关于在本机互操作中控制 WPF的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中本机互操作性的代码组织

.NET 中本机互操作性的代码组织

WPF App - MFC App 互操作

WPF与Win32互操作

WinForms 互操作,从 WinForms 拖放 -> WPF

本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃