2013-07-04 148 views
8

我們有一些問題有相當大的,複雜的桌面應用程序,其中用於WPF使用微軟織帶(或連接到這件事的組合)會導致計算機掛起掛。是什麼原因導致的Windows在這WPF絲帶應用

下歸結代碼似乎觸發了一些計算機的一個Windows死機的情況。有些電腦每次都會遇到這種情況,有些電腦永遠不會遇到這種情況。在某些計算機上掛起會使整個會話鎖定(包括num lock和大寫鎖定),但在其他計算機上,鼠標仍然會移動(num lock仍然無法使用)。當計算機無響應時,似乎遠程登錄和網絡共享等工作仍然有效,但無法結束控制檯會話。

總之,似乎是行爲的根本原因是幾件事情的組合:

  • 微軟絲帶WPF
  • 的Windows在ElementHost的
  • 窗體應用程序託管WPF控件
  • 使用雙緩衝的Windows窗體(使用的CreateParams的)
  • 使用軟件渲染的WPF色帶

我們以後用WS_EX_COMPOSITED只在幾個選定的形式解決了這個問題,但我非常想揭開這個問題的根本原因。

我還沒有發現一個簡單的方法來重現掛起,但這個最小的應用似乎通過做一些最大化/還原並將鼠標懸停在絲帶按鈕。

下面的代碼被編譯爲x86的.NET 4.0,對Microsoft WPF Ribbon .NET 4.0庫。

using System; 
using System.Windows.Forms; 
using Microsoft.Windows.Controls.Ribbon; 
using System.Windows.Interop; 
using System.Windows.Forms.Integration; 

namespace WindowsRibbonHang 
{ 
    public class Form1 : Form 
    { 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams cp = base.CreateParams; 
       cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 
       return cp; 
      } 
     } 

     public Form1() 
     { 
      Ribbon ribbon = new Ribbon(); 

      RibbonTab tab = new RibbonTab { Header = "FooTab" }; 
      ribbon.Items.Add(tab); 

      RibbonSplitButton button = new RibbonSplitButton { Label = "FooButton" }; 
      tab.Items.Add(button); 

      ElementHost elementHost = new ElementHost 
      { 
       Dock = DockStyle.Fill, 
       Child = ribbon, 
      }; 

      Controls.Add(elementHost); 
      Dock = DockStyle.Fill; 

      ribbon.Loaded += (sender, args) => { 
       HwndSource hwndSource = System.Windows.PresentationSource.FromVisual(ribbon) as HwndSource; 
       HwndTarget hwndTarget = hwndSource.CompositionTarget; 
       hwndTarget.RenderMode = RenderMode.SoftwareOnly; 
      }; 
     } 
    } 

    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 
} 
+0

你有沒有解決過這個問題?我只能找到這個問題,而這另一個http://stackoverflow.com/questions/7719627/wpf-elementhost-in-winforms-crashes-windows-when-maximized在這個問題上,但都沒有找到解決辦法。 –

+0

@EduardoWada不是。正如@Olly所說,這可能與WPF與圖形驅動程序交互的方式有關。 「解決方案」是禁用'CreateParams'重寫,而是在更多的目標表單上進行。 – torkildr

回答

1

嘗試檢查受影響的計算機上的圖形驅動程序是否是最新的。 WPF的工作方式與傳統的GDI代碼非常不同,所以有時候不可靠的驅動程序會導致你描述的那類問題。

+0

我也在想它可能是圖形驅動程序相關的。有趣的是,這似乎發生在多個顯卡供應商身上。正如您所建議的那樣,我也嘗試更新到最新的圖形驅動程序。 – torkildr

1

正如你所發現的問題帶有複合窗。我分析這個問題進一步,它似乎是一個OS相關的問題:

The Case of Slow WPF Rendering in a WinForms Application

兩個線程試圖渲染和其中一個上線的複合材料的WinForms窗口中呈現並互相窗口在一個循環中無效WPF呈現線程的另一個線程執行相同的操作。只要軟件渲染處於活動狀態,就會發生在Win 7 - Win 10計算機上。

它看起來像一個DWM(桌面窗口管理器)問題,即只有MS高手能告訴我們,如果WPF或WinForms的違反的隱性契約,或者如果它是一個普通的DWM錯誤。

相關問題