2017-09-25 99 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問題......並且我無法繼續使用它 –

相關問題