Abbiamo avuto alcuni problemi con un'applicazione desktop piuttosto ampia e complessa in cui l'utilizzo di Microsoft Ribbon per WPF (o una combinazione di cose collegate a questa) fa sì che il computer appendere.Cosa causa il blocco di Windows in questa applicazione della barra multifunzione WPF
Il codice di seguito riportato sembra attivare una situazione di blocco di Windows su un numero di computer. Alcuni computer sperimenteranno questo blocco ogni volta, alcuni non lo sperimenteranno mai. In alcuni computer l'intero blocco della sessione si bloccherà (compresi il bloc num e il bloc maiusc), mentre su altri il mouse si muoverà ancora (il bloc num non ha ancora funzionato). Quando il computer non risponde, sembra che funzioni come l'accesso remoto e la condivisione di rete continuino a funzionare, ma non è possibile terminare la sessione della console.
In breve, quello che sembra essere la causa principale del comportamento è la combinazione di un paio di cose:
- Microsoft Ribbon per WPF
- applicazione Windows Form che ospita il controllo WPF in un'ElementHost
- l'uso di Windows Form tamponati doppie (mediante l'uso di CreateParams)
- l'uso del software di rendering sul nastro WPF
In seguito abbiamo risolto questo problema utilizzando WS_EX_COMPOSITED
solo su alcuni moduli selezionati, ma mi piacerebbe molto scoprire la causa principale di questo problema.
Devo ancora scoprire un modo semplice per riprodurre il blocco, ma questa applicazione minima sembra portare a termine l'attività, almeno su alcune macchine, facendo un po 'di ingrandimento/ripristino e passando il mouse sopra il mouse bottone a nastro.
Il seguente codice è stato compilato come x86 .NET 4.0, rispetto alla libreria .NET 4.0 Microsoft WPF Ribbon.
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());
}
}
}
Hai mai risolto questo problema? Ho potuto trovare solo questa domanda e questa altra http://stackoverflow.com/questions/7719627/wpf-elementhost-in-winforms-crashes-windows-when-maximized su questo problema, ma nessuno dei due ha trovato una soluzione. –
@ EduardoWada Non proprio. Come detto @lyly, questo probabilmente ha a che fare con il modo in cui WPF interagisce con i driver grafici. La "soluzione" era disabilitare l'override di 'CreateParams', e farlo invece su moduli più mirati. – torkildr