Microsoft Ribbon for WPF(またはこれに接続されたものの組み合わせ)を使用すると、コンピュータが大規模で複雑なデスクトップアプリケーションにいくつかの問題が発生しました。ハング。このWPFリボンアプリケーションでWindowsがハングアップする原因
以下のコードは、いくつかのコンピュータでWindowsがハングする状況を引き起こしているようです。一部のコンピュータでは毎回このハングアップが発生しますが、一部のコンピュータではこれが発生しません。ハングすると、一部のコンピュータではセッション全体がロックされます(num lockとcaps lockを含む)が、マウスはまだ動きます(num lockはまだビジネスから外れています)。コンピュータが応答しなくなると、リモートログオンやネットワーク共有のように見えますが、コンソールセッションを終了することはできません。
- マイクロソフトリボンWPF
- WindowsはElementHost でWPFコントロールをホストするフォームアプリケーション用:要するに
- WPFリボン上でレンダリングソフトウェアの
- 使用(CreateParamsを使用することによって)ダブルバッファリングWindowsフォームの使用
は、何が行動の根本的な原因は、いくつかの組み合わせであるように思わ
私たちは後ほどいくつかの選択されたフォームでWS_EX_COMPOSITED
を使用してこの問題を解決しましたが、この問題の根本原因を明らかにしたいと思います。
私はハングを再現するための簡単な方法をまだ発見していませんが、この最小限のアプリケーションは、少なくとも一部のマシンでは、マウスを最大限に復元/リボンボタン。
次のコードは、Microsoft WPF Ribbon .NET 4.0ライブラリに対して、x86 .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());
}
}
}
この問題を解決しましたか?私はこの問題とこの他の1つだけを見つけることができましたhttp://stackoverflow.com/questions/7719627/wpf-elementhost-in-winforms-crashes-windows-when-maximizedこの問題についてはどちらも解決策を見いだせませんでした。 –
@EduardoWadaそうではありません。 @Ollyが述べたように、これはおそらくWPFがグラフィックスドライバとやり取りする方法と関係しているはずです。 "解決策"は、 'CreateParams'オーバーライドを無効にして、代わりによりターゲットを絞ったフォームで行うことでした。 – torkildr