Pregunta

He conectado un comportamiento definido de esa manera,..

    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");
                }
        }
    }
}

Es un buen simple se adjunta el comportamiento que se abre un OpenFileDialog cuando usted haga clic en un cuadro de texto y pone el nombre de archivo en el cuadro de cuando hayas terminado.

Funciona tal vez el 40% del tiempo, pero el resto del tiempo, toda la aplicación se bloquea.La pila de llamadas en este punto parece que esta -

[Managed to Native Transition]  

WindowsBase.dll!La SEÑORA de Win32.UnsafeNativeMethods.GetMessageW(Sistema ref.Windows.De interoperabilidad.MSG MSG, Sistema.En tiempo de ejecución.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 bytes
WindowsBase.dll!Sistema.Windows.Las operaciones de roscado.Despachador.GetMessage(Sistema ref.Windows.De interoperabilidad.MSG MSG, Sistema.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 bytes WindowsBase.dll!Sistema.Windows.Las operaciones de roscado.Despachador.PushFrameImpl(Del Sistema.Windows.Las operaciones de roscado.DispatcherFrame frame = {Sistema.Windows.Las operaciones de roscado.DispatcherFrame}) + 0x8b bytes WindowsBase.dll!Sistema.Windows.Las operaciones de roscado.Despachador.PushFrame(Del Sistema.Windows.Las operaciones de roscado.DispatcherFrame marco) + 0x49 bytes
WindowsBase.dll!Sistema.Windows.Las operaciones de roscado.Despachador.Run() + 0x4c bytes
PresentationFramework.dll!Sistema.Windows.Aplicación.RunDispatcher de objeto(ignorar) + 0x1e bytes
PresentationFramework.dll!Sistema.Windows.Aplicación.RunInternal(Del Sistema.Windows.Ventana ventana) + 0x6f bytes PresentationFramework.dll!Sistema.Windows.Aplicación.Ejecutar(El Sistema.Windows.Ventana ventana) + 0 x 26 bytes PresentationFramework.dll!Sistema.Windows.Aplicación.Run() + 0 x 19 bytes Debugatron.exe!Debugatron.App.Main() + 0x5e bytes C# [Nativo Gestionados en Transición]
[Administrados a los Nativos de Transición]
mscorlib.dll!Sistema.Dominio de aplicación.nExecuteAssembly(del Sistema.Reflexión.La asamblea de la asamblea, string[] args) + 0 x 19 bytes mscorlib.dll!Sistema.En tiempo de ejecución.Hosting.ManifestRunner.Ejecutar(bool checkAptModel) + 0x6e bytes mscorlib.dll!Sistema.En tiempo de ejecución.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 bytes mscorlib.dll!Sistema.En tiempo de ejecución.Hosting.ApplicationActivator.CreateInstance(Del Sistema.ActivationContext activationContext, string[] activationCustomData) + 0 x 65 bytes mscorlib.dll!Sistema.En tiempo de ejecución.Hosting.ApplicationActivator.CreateInstance(Del Sistema.ActivationContext activationContext) + 0xa bytes mscorlib.dll!Sistema.Activador.CreateInstance(Del Sistema.ActivationContext activationContext) + 0x3e bytes
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 bytes
mscorlib.dll!Sistema.Las operaciones de roscado.ThreadHelper.ThreadStart_Context(estado del objeto) + 0x66 bytes
mscorlib.dll!Sistema.Las operaciones de roscado.ExecutionContext.Ejecutar(El Sistema.Las operaciones de roscado.ExecutionContext executionContext, Sistema.Las operaciones de roscado.Devolución de llamada ContextCallback, el estado del objeto) + 0x6f bytes
mscorlib.dll!Sistema.Las operaciones de roscado.ThreadHelper.ThreadStart() + 0 x 44 bytes

Ahora, he visto este tipo de cosas antes de la hora de hacer ciertos asincrónica cosas, pero no hay nada de eso pasando en ese momento.El único hilo vivo es el subproceso de interfaz de usuario!También, Me siempre conseguir que la última declaración de depuración cuando se hace colgar.

Puede alguien me apunte en la dirección correcta?Este me vuelve loca!

¿Fue útil?

Solución

Tengo una muy simple aplicación de WPF que se utiliza el control WebBrowser WPF en una aplicación WPF.Tengo exactamente el mismo problema.El control WebBrowser WPF (con Google Earth lanzado el uso de JavaScript) se congela alrededor del 75% de las veces cuando se cambia el tamaño de la ventana horizontal.Puedo obtener el mismo volcado de pila como se indica anteriormente.Cuando copio y ejecutar el archivo ejecutable en un PC diferente (todos corriendo XP SP3) funciona muy bien y nunca se cuelga.También tengo una aplicación más compleja que es multi-hilo que también se bloquea con una similar de volcado de pila (que también se espera en un mensaje en el hilo de la biblioteca) en este PC, pero no en otro PC.El control WebBrowser WPF aplicación tiene el mismo problema si es dirigida por .Net 3.5 o 4.0.He utilizado NETfx_Setupverifier para verificar la .instalaciones de red son correctas, pero yo todavía sospecha que hay un problema con cualquiera de los dos .net o algunos COM utilidad que está causando el .NET - interoperabilidad COM a ser inestable.Es también supongo que mi aplicación está esperando en algunos no administrado evento/mensaje que nunca llega debido a un problema con la interoperabilidad.También escribí la misma aplicación simple de usar WinForms/WinForm Control WebBrowser y que la aplicación nunca se cuelga en el mismo PC.

¿Alguien tiene alguna sugerencia sobre cómo localizar la causa?Estoy pensando en completamente desinstalar/reinstalar el .NET marcos pesar de que se verificó la correcta.Yo no sé ni dónde buscar anomalías en el COM lado.

Otros consejos

Aquí va algunos hechos y preguntas casi al azar, que podría ayudarle.

En primer lugar, yo no podía reproducir su problema. No importa cuánto lo intentara. Siempre trabajó.

Seguimiento de la pila también se ve bien para mí: se mantiene el procesamiento de mensajes de bucle. ¿Qué es exactamente lo que confunde? Logrado transición nativa?

No se puede tener un hilo en la aplicación de WPF. ¿Qué ves en la ventana de Temas en el depurador de VS?

Cuando llegué a romper todo lo que veo la llamada a ofd.ShowDialog () en el seguimiento de la pila principal hilo, y un hilo trabajador llamado .NET SystemEvents permanece en WindowThreadProc (), a la espera de un objeto de sincronización. ¿Qué ves?

Parece que se metió en punto muerto de alguna manera.

Trate contenidos envoltura OpenFileBrowser() en try... catch{}. ¿Hay algún error?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top