将一个 Unity .exe 文件嵌入到多个 WPF 页面中
Posted
技术标签:
【中文标题】将一个 Unity .exe 文件嵌入到多个 WPF 页面中【英文标题】:Embed one Unity .exe file into multiple WPF Pages 【发布时间】:2021-10-15 11:54:27 【问题描述】:我有一个嵌入 Unity3D 应用程序的 WPF 应用程序,类似于:Embed Unity3D app inside WPF application
使用 WindowsFormsHost 和 WinForms:Panel 嵌入到 WPF 页面中
<WindowsFormsHost><WinForms:Panel x:Name="MyGame"/></WindowsFormsHost>
现在,我的应用程序要求我在 WPF 应用程序的不同页面上显示不同的 Unity.exe 场景。例如,在 Page1 上 Unity.exe 显示 Scene1,在 Page2 上 Unity.exe 显示 Scene2。我有一个 TCP 通信来在场景之间切换。
实现此目的的一种方法是在每次用户导航到新页面时终止运行 Unity.exe 的进程并重新启动它。但是,这将导致用户每次都等待 Unity.exe 加载。因此,是否可以嵌入在一个进程上运行的 .exe 文件并将其显示在多个 WPF 页面上?不知何故,当用户导航到没有嵌入的普通页面时,我喜欢让进程在后台运行。
我的直觉是,将 .exe 文件嵌入到用户控件中可能是一种可能的解决方案,但到目前为止我还没有找到足够的信息。
【问题讨论】:
【参考方案1】:我是another related question on Stack Overflow 上其中一个答案的作者。我创建了a repository,它是您存储库的一个分支,具有您想要的行为。
我看到你喜欢使用 Frames,这没关系,但正因为如此,我为你修复了两个关于原始存储库的不良行为。
使用MainWindow.xaml
的Frame
中的属性NavigationUIVisibility="Hidden"
可以避免导航面板仍然显示的事实。
您还通过电子邮件告诉我“第二次”单击按钮时,WinformsHost
没有出现。这是因为更改Frame
的内容并不是根据定义触发刷新。您可以通过 Page2_UnityFrame.NavigationService.Refresh();
行强制刷新,Page3
和 Page4
类似。
我使用此代码进行了测试,现在我认为该行为完全符合您的要求。不过,我想借此机会就这个版本的应用程序提供一些额外的建议。
我冒昧地放置了您的 Unity 文件(和相关文件夹)并将它们重新定位到名为All_Unity_Files
的文件夹中。然后,在容器项目的构建后事件中,我可以指定需要将这些 Unity 文件(和文件夹)复制到目标目录。这是通过命令完成的:xcopy "$(SolutionDir)..\All_Unity_Files" "$(TargetDir)" /s /y /r /d
。因此,如果您现在下载此代码或克隆存储库,如果构建成功,所需的 Unity 文件会自动位于正确的目录中以启动应用程序。
其次,我还将页面的Frames重命名为Page1_UnityFrame
、Page2_UnityFrame
等。之前,这些框架和 MainWindow.xaml 中的主框架都具有相同的 x:Name
(UnityFrame),这是我不推荐的。如果您更改代码隐藏,则很难确定您正在获取或设置哪个框架,因此更难以调试。
作为第三点也是最后一点,我建议您了解通过 MVVM 进行数据绑定的可能性。这将最大限度地减少代码隐藏中的代码量,特别是如果您的应用程序会增长,它会更容易维护。
【讨论】:
非常感谢 Joachim 的帮助!该解决方案解决了我们项目的所有需求。 不客气!以上是关于将一个 Unity .exe 文件嵌入到多个 WPF 页面中的主要内容,如果未能解决你的问题,请参考以下文章