2017-09-25 70 views
0

我有一个WPF应用程序,我尝试在几个虚拟机上安装。在每个64位Windows上,它工作正常,但在每个32位窗口中,WPF应用程序UI的反应都很笨拙。在32位Windows 7和Windows 8.1上的WPF渲染问题

在32位机器上WPF应用程序有什么特别的吗?

+0

支票DOTNET版本 –

+4

究竟你的意思由*“UI响应笨拙” *? – bassfader

+0

我有一个Windows移动样式的应用程序。当我点击一个菜单按钮时,界面的一部分发生了变化,剩下的不用,但是其他部分会在你用鼠标指针输入时显示出来。 –

回答

1

由于@swiszcz铅,我设法解决在Win 7和Win 8.1 x86的VM呈现问题通过添加下面的代码上的应用程序启动方法:

RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly; 

编辑:是完全最佳,我现在检查程序是在物理机器上还是在虚拟机上运行。在虚拟机上,我将RenderMode设置为SoftwareOnly,并在物理机上将RenderMode设置为Default。

下面是代码这样做:

public partial class App : Application 
{ 

    public App() 
    { 
     Startup += Application_Startup; 
     Exit += Application_Exit; 

     InitializeComponent(); 
    } 

    /// <summary> 
    /// Detect if the local machine is a virtual or a physical one 
    /// </summary> 
    /// <returns>True if the local machine is virtual, False if the local machine is physical</returns> 
    private bool IsVirtualMachine() 
    { 
     using (var searcher = new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem")) 
     { 
      using (var items = searcher.Get()) 
      { 
       foreach (var item in items) 
       { 
        string manufacturer = item["Manufacturer"].ToString().ToLower(); 
        if ((manufacturer == "microsoft corporation" && item["Model"].ToString().ToUpperInvariant().Contains("VIRTUAL")) 
         || manufacturer.Contains("vmware") 
         || item["Model"].ToString() == "VirtualBox") 
        { 
         return true; 
        } 

        // Check "HypervisorPresent" property, which is available in some cases. 
        var hypervisorPresentProperty 
         = item.Properties 
          .OfType<PropertyData>() 
          .FirstOrDefault(p => p.Name == "HypervisorPresent"); 

        if ((bool?)hypervisorPresentProperty?.Value == true) 
        { 
         return true; 
        } 
       } 
      } 
     } 
     return false; 
    } 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     //Alter the rendering for the virtual machine (see Bug 
     if (this.IsVirtualMachine()) 
      RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly; 
     else 
      RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.Default; 

    } 
} 
+1

您应该注意,即使是具有问题视频卡驱动程序的物理机器也可能让WPF应用程序受到影响。因此,您应该为最终用户提供配置软件渲染的方法,而不仅仅是硬代码。 –

+0

也许你是对的,我会考虑让它通过.config文件管理,而不是最终用户参数,但确实是高级支持用户会做的事情。 Thx让我意识到这个问题 –

0

我假设您正在使用部署的Click Once选项,您需要首先检查您的所有依赖关系,并确保所有的依赖关系都与x86兼容,如果他们进入您的项目属性,请确保在Build有平台目标确保任何CPU被检查。这是我开始的地方。

+0

其实我正在使用WIX来安装所有的依赖关系。我将检查构建设置 –

+0

所有项目已在Build/Platform Target属性中设置为x86。它可以在任何x64 Windows上正常工作。是否有可能与虚拟机连接?我不知道在真实安装中是否会出现htis问题......并且我无法继续使用它 –

相关问题