将一个 Unity .exe 文件嵌入到多个 WPF 页面中

Embed one Unity .exe file into multiple WPF Pages

我有一个嵌入 Unity3D 应用程序的 WPF 应用程序,与此类似:

使用 WindowsFormsHost 和 WinForms:Panel

嵌入 WPF 页面

<WindowsFormsHost><WinForms:Panel x:Name="MyGame"/></WindowsFormsHost>

现在,我的应用程序要求我在 WPF 应用程序的不同页面上显示 Unity.exe 的不同场景。例如,在第 1 页上 Unity.exe 显示场景 1,而在第 2 页上 Unity.exe 显示场景 2。我有一个 TCP 通信来在场景之间切换。

实现此目的的一种方法是终止进程 运行 Unity.exe 并在每次用户导航到新页面时重新启动它。但是,这将导致用户每次都等待 Unity.exe 加载。那么,是否可以在一个进程上嵌入一个.exe文件运行,然后在多个WPF页面上显示呢?不知何故,当用户导航到没有嵌入的普通页面时,我喜欢在后台运行进程 运行。

我的直觉告诉我,将 .exe 文件嵌入用户控件可能是一个可能的解决方案,但到目前为止我没有找到足够的信息。

我是 . I made a repository 上的一个答案的作者,它是您的存储库的一个分支,具有您预期的行为。

我看到您喜欢使用 Frames,这没关系,但正因为如此,我为您修复了两个与原始存储库相关的不良行为。

  • 可以使用 MainWindow.xamlFrame 中的属性 NavigationUIVisibility="Hidden" 来避免导航面板仍然显示的事实。

  • 您还通过电子邮件告诉我“第二次”单击按钮时,WinformsHost 没有显示。这是因为根据定义,更改 Frame 的内容不会触发刷新。您可以通过 Page2_UnityFrame.NavigationService.Refresh(); 行强制刷新,Page3Page4.

    类似

我用这段代码进行了测试,现在我认为行为完全符合您的要求。不过,我想借此机会就此版本的应用程序提供一些额外的建议。

  • 我冒昧地把你的 Unity 文件(和相关文件夹)放到了一个名为 All_Unity_Files 的文件夹中。然后,在容器项目的 post-build-event 中,我可以指定需要将这些 Unity 文件(和文件夹)复制到目标目录。这是通过命令完成的: xcopy "$(SolutionDir)..\All_Unity_Files" "$(TargetDir)" /s /y /r /d 。因此,如果您现在下载此代码或克隆存储库,如果构建成功,所需的 Unity 文件将自动位于正确的目录中以启动应用程序。
  • 其次,我还将页面的Frames重命名为Page1_UnityFramePage2_UnityFrame等。以前,这些框架和 MainWindow.xaml 中的主框架都具有相同的 x:Name (UnityFrame),这是我不推荐的。如果您更改代码隐藏,则很难确定您正在获取或设置哪个帧,因此更难调试。
  • 作为第三点也是最后一点,我建议您了解通过 MVVM 进行数据绑定的可能性。这将最大限度地减少代码隐藏中的代码量,特别是如果您的应用程序将增长,它将更容易维护。