Subproceso de interfaz de usuario y ventana emergente de WPF

Algunos antecedentes ...
Estoy tratando de dar retroalimentación visual cuando se hace clic en un botón... básicamente un mensaje emergente de carga (usando un control emergente wpf). El problema es... porque estoy en el subproceso de la interfaz de usuario y en el código síncrono, se hace clic en el botón y ocurre la lógica, luego aparece la ventana emergente. Quería que la ventana emergente apareciera al hacer clic en el botón, ejecutar algún código y luego desaparecer (la ventana emergente debería aparecer mientras se ejecuta el código).

Me doy cuenta de que puedo hacerlo con hilos, pero esa no es una opción en este momento. Tengo restricciones de tiempo y no tengo tiempo para arreglar la aplicación "de la manera correcta".

Antes de obtener los gemidos normales acerca de hacerlo "bien"...

  • No escribí la aplicación, solo me encargué de intentar mejorar el rendimiento (y/o percepción de rendimiento) sin una revisión completa.
  • En algún momento, espero poder reorganizar esta aplicación, solo unos pequeños ajustes van a funcionar por ahora.
  • No hay ViewModel... el código está muy, muy acoplado a la interfaz de usuario. (Como dije, no hice bien la aplicación)
  • Por varias razones, no puedo usar hilos en este escenario, no sin romper muchas otras piezas en la aplicación y mis limitaciones de tiempo.

Entonces, ¿hay alguna forma de lograr esto en este escenario (por cierto... no hay ViewModel y no puedo crear uno en este momento debido al estrecho acoplamiento entre la lógica y la interfaz de usuario)?



Control emergente

<Popup Name="popLoading" Placement="Center">
            <Border CornerRadius="10" Background="#ffffff">
                <Grid Width="400" Height="200">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Image Grid.Column="0" Name="imgLoading" Source="/foo/Images/loading.png"  />
                    <TextBlock Name="txtLoading" Text="Retreiving data..."/>
                </Grid>
            </Border>
        </Popup>          

Clic del botón

private void MyButton_Click(object sender, RoutedEventArgs e)
    {
        popLoading.IsOpen = true;
        
        //Do Some Stuff hopefully popup is showing up on the screen. 

        popLoading.IsOpen = false;
        
    }

preguntado el 21 de mayo de 12 a las 19:05

¿Qué tiene de difícil poner la lógica en un hilo, en serio? -

@HB Están sucediendo algunas cosas que se rompen en otras partes de la aplicación y causan problemas de sincronización. Ciertas cosas tienen que pasar para que se rompa el hilo (ya lo he intentado) y no es que sea difícil, es que llevará demasiado tiempo. Si no hay soluciones rápidas aquí, me olvidaré de la ventana emergente hasta que realmente pueda arreglar la aplicación. -

Es posible que pueda hacer algo usando DispatcherFrames... -

Le echaré un vistazo, gracias. -

1 Respuestas

¿Es realmente oneroso crear un trabajador de fondo ¿Para cualquier proceso de larga duración que esté regando la interfaz de usuario?

Otro truco de interfaz de usuario que uso en WinForms es tener una barra de estado en la parte inferior que dice cuándo se está cargando algo (en los días en que hacía exactamente lo que este programa está haciendo mal)

contestado el 21 de mayo de 12 a las 19:05

No, no es oneroso, pero el código anterior es una pequeña parte simplificada de lo que realmente está haciendo la aplicación. No es un problema de proceso de larga ejecución, es más un problema de sincronización de datos, el único problema es que no tengo tiempo para hacer esto con subprocesos. Demasiadas otras cosas dejan de funcionar correctamente en la aplicación. Realmente solo estoy tratando de poner una curita en esta cosa. - AGoodDisplayName

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.