Domanda

Ho un comportamento allegato definito questa convenzione, ..

    public static class FileBrowserBehaviour
{


    public static bool GetBrowsesOnClick(DependencyObject obj)
    {
        return (bool)obj.GetValue(BrowsesOnClickProperty);
    }

    public static void SetBrowsesOnClick(DependencyObject obj, bool value)
    {
        obj.SetValue(BrowsesOnClickProperty, value);
    }

    // Using a DependencyProperty as the backing store for BrowsesOnClick.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BrowsesOnClickProperty =
        DependencyProperty.RegisterAttached("BrowsesOnClick", typeof(bool), typeof(FileBrowserBehaviour), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(BrowsesOnClickChanged)));


    public static void BrowsesOnClickChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        FrameworkElement fe = obj as FrameworkElement;

        if ((bool)args.NewValue)
        {
            fe.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(OpenFileBrowser);
        }
        else
        {
            fe.PreviewMouseLeftButtonDown -= new MouseButtonEventHandler(OpenFileBrowser);
        }
    }

    static void OpenFileBrowser(object sender, MouseButtonEventArgs e)
    {
        var tb = sender as TextBox;
        if (tb.Text.Length < 1 || tb.Text=="Click to browse..")
        {
            OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "Executables | *.exe";
                if (ofd.ShowDialog() == true)
                {
                    Debug.WriteLine("Setting textbox text-" + ofd.FileName);
                    tb.Text = ofd.FileName;
                    Debug.WriteLine("Set textbox text");
                }
        }
    }
}

E 'un bel semplice comportamento allegato che si aprirà un OpenFileDialog quando si fa clic su una casella di testo e mette il nome del file nella casella quando hai finito.

Funziona forse il 40% del tempo, ma il resto del tempo l'intera applicazione si blocca. Lo stack di chiamate a questo punto si presenta così -

[Managed to Native Transition]  
  

WindowsBase.dll! MS.Win32.UnsafeNativeMethods.GetMessageW (ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 byte
      WindowsBase.dll! System.Windows.Threading.Dispatcher.GetMessage (ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 byte       WindowsBase.dll! System.Windows.Threading.Dispatcher.PushFrameImpl (struttura System.Windows.Threading.DispatcherFrame = {System.Windows.Threading.DispatcherFrame}) + 0x8b byte       WindowsBase.dll! System.Windows.Threading.Dispatcher.PushFrame (telaio System.Windows.Threading.DispatcherFrame) + 0x49 byte
      WindowsBase.dll! System.Windows.Threading.Dispatcher.Run () + 0x4c byte
      PresentationFramework.dll! System.Windows.Application.RunDispatcher (oggetto ignorare) + 0x1e byte
      PresentationFramework.dll! System.Windows.Application.RunInternal (System.Windows.Window finestra) + 0x6F byte       PresentationFramework.dll! System.Windows.Application.Run (System.Windows.Window finestra) + 0x26 byte       PresentationFramework.dll! System.Windows.Application.Run () + 0x19 byte       Debugatron.exe! Debugatron.App.Main () + 0x5e byte C #       [Nativo di Transizione Managed]
      [Riuscito a Transizione Native]
      mscorlib.dll! System.AppDomain.nExecuteAssembly (System.Reflection.Assembly assemblaggio, string [] args) + 0x19 byte       Mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run (bool checkAptModel) + 0x6E byte       mscorlib.dll! System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly () + 0x84 byte       mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext, string [] activationCustomData) + 0x65 byte       mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext) + 0xa byte       mscorlib.dll! System.Activator.CreateInstance (System.ActivationContext activationContext) + 0x3E byte
      Microsoft.VisualStudio.HostingProcess.Utilities.dll! Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone () + 0x23 byte
      mscorlib.dll! System.Threading.ThreadHelper.ThreadStart_Context (stato oggetto) + 0x66 byte
      mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext ExecutionContext, System.Threading.ContextCallback callback, stato dell'oggetto) + 0x6F byte
      mscorlib.dll! System.Threading.ThreadHelper.ThreadStart () + 0x44 byte

Ora, ho visto questo genere di cose prima, quando fare alcune cose asincrono, ma non c'è niente di tutto questo sta succedendo in quel punto. L'unico filo vivo è il thread UI! Inoltre, I sempre ottenere l'ultima affermazione di debug quando lo fa appendere.

Qualcuno mi può punto nella giusta direzione? Questo sta facendo impazzire!

È stato utile?

Soluzione

ho una molto semplice applicazione WPF che utilizza il controllo WebBrowser WPF in un'applicazione WPF. Ho esattamente lo stesso problema. Il controllo WebBrowser WPF (con Google Earth ha lanciato utilizzando JavaScript) si blocca circa il 75% del tempo in cui ho ridimensiona la finestra in senso orizzontale. Ho la stessa identica dump dello stack, come riportato sopra. Quando copio / eseguire il file eseguibile su un altro PC (tutti in esecuzione XP SP3) funziona benissimo e mai si blocca. Ho anche un'applicazione più complessa che è multi-threaded che pende anche con un dump di stack simile (anche in attesa di un messaggio all'interno della libreria Threading) su questo PC, ma non un altro PC. L'applicazione di controllo WebBrowser WPF ha lo stesso problema se questi siano destinati per la Net 3.5 o 4.0. Ho usato NETfx_Setupverifier per verificare le installazioni .net sono corretti, ma ho ancora il sospetto che ci sia un problema sia con .net o qualche programma di utilità COM che causa il .NET - interoperabilità COM ad essere instabile. E 'anche la mia ipotesi che la mia applicazione è in attesa su alcuni non gestito evento / messaggio che non arriva mai a causa di un problema con l'interoperabilità. Ho anche scritto la stessa semplice applicazione utilizzando WinForms / WinForm WebBrowser di controllo e che app non si blocca sullo stesso PC.

Qualcuno ha qualche suggerimento su come rintracciare la causa? Sto pensando di completamente disinstallazione / reinstallazione dei quadri .NET anche se sono stati verificati corretta. Io non so nemmeno dove cercare le anomalie sul lato COM.

Altri suggerimenti

Qui va alcuni fatti e domande quasi casuali, che potrebbero aiutare.

Prima di tutto, non ho potuto riprodurre il problema. Non importa quanto ho provato. E 'sempre funzionato.

traccia Pila guarda anche bene per me: mantiene l'elaborazione dei messaggi loop. Quello che si confonde esattamente? Riuscito a transizione nativa?

Non si può avere un thread in un'applicazione WPF. Cosa vedi nella finestra Discussioni in VS Debugger?

Quando mi ha colpito rompere tutto quello che vedo la chiamata a ofd.ShowDialog () nella principale stack trace filo, e un thread di lavoro denominato NET SystemEvents rimane in WindowThreadProc (), in attesa di un oggetto di sincronizzazione. Che cosa vedi?

Sembra che hai in stallo in qualche modo.

contenuto involucro Prova OpenFileBrowser() in try... catch{}. Ci sono degli errori?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top