2013-07-04 16 views
8

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()); 
     } 
    } 
} 
+0

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. –

+0

@ 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

risposta

1

Provare a verificare che i driver di grafica sui computer interessati siano aggiornati. WPF funziona in modo molto diverso dal codice GDI tradizionale, quindi a volte i driver inaffidabili possono causare il tipo di problema che descrivi.

+0

Sto anche pensando che potrebbe essere un driver grafico correlato.Ciò che è interessante notare è che sembra accadere tra più fornitori di schede grafiche. Ho anche, come hai suggerito, provato ad aggiornare il driver grafico più recente. – torkildr

1

Come si è riscontrato il problema si presenta con Windows composito. Ho analizzato ulteriormente la questione e sembra essere un problema correlato OS:

Vedi The Case of Slow WPF Rendering in a WinForms Application

Due fili tenta di rendering e invalidare ogni altra finestra in un ciclo in cui su un filo finestra Winforms composito rende e l'altro thread il thread di rendering di WPF fa la stessa cosa. Questo succede su Win 7 - Win 10 machine fino a quando il rendering del software è attivo.

Sembra un problema DWM (Desktop Window Manager) in cui solo gli esperti MS possono dirci se WPF o WinForms violano un contratto implicito o se si tratta di un bug DWM semplice.

Problemi correlati