我們有一些問題有相當大的,複雜的桌面應用程序,其中用於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());
}
}
}
你有沒有解決過這個問題?我只能找到這個問題,而這另一個http://stackoverflow.com/questions/7719627/wpf-elementhost-in-winforms-crashes-windows-when-maximized在這個問題上,但都沒有找到解決辦法。 –
@EduardoWada不是。正如@Olly所說,這可能與WPF與圖形驅動程序交互的方式有關。 「解決方案」是禁用'CreateParams'重寫,而是在更多的目標表單上進行。 – torkildr