ChildWindow es una ventana modal, pero no bloquea. ¿Hay alguna forma de bloquearlo? Básicamente quiero un método ShowDialog() que llame a ChildWindow.Show() pero que no regrese hasta que el usuario haya cerrado ChildWindow. Intenté usar Monitor.Enter() para bloquear después de ChildWindow.Show(), pero ChildWindow nunca se procesó y el navegador se colgó. ¿Alguien tiene alguna idea?Cómo hacer que ChildWindow bloquee
Respuesta
No creo que sea compatible con ese comportamiento. Puede vote for it en CodePlex. Según lo que desee, puede look at some of Tim Heuer's workarounds here o utilizar un control personalizado diferente, como Silverlight Modal Control (on CodePlex).
No puede hacer lo que está tratando de hacer en Silverlight. Cualquier cambio que realice en la interfaz de usuario se ejecutará en el hilo de la interfaz de usuario. Si bloquea el hilo de la interfaz de usuario, el usuario no puede interactuar con el navegador, por lo que no se puede realizar ninguna acción para desbloquear el hilo.
Si realmente desea crear una ventana de diálogo de bloqueo, la única manera de hacerlo es desde un subproceso que no sea UI. P.ej. se podría crear un método que se ve algo como:
private void ShowModalDialog()
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
Dispatcher.BeginInvoke(() =>
{
ChildWindow cw = new ChildWindow();
cw.Content = "Modal Dialog";
cw.Closed += (s, e) => waitHandle.Set();
cw.Show();
});
waitHandle.WaitOne();
}
Este método se mostrará una ventana de diálogo y no volverá hasta que la ventana de diálogo se cierra. Pero este método solo se puede invocar desde un no UI-thread. Llamar desde el hilo de la interfaz de usuario provocará un interbloqueo (dado que el hilo de la interfaz de usuario está esperando un evento que solo puede iniciarse en el hilo de la interfaz de usuario).
Como alternativa, debe considerar hacer su lógica asincrónica en lugar de forzarla a ser sincrónica.
Me gusta esta solución y parece que debería funcionar, pero dado que no se puede invocar en el hilo de la interfaz de usuario, no estoy seguro de poder usar esto (aunque no especifiqué eso en mi pregunta (ya que Ni siquiera lo pensé entonces)). De cualquier manera, gran solución. –
Intenté crear un diálogo modal "de bloqueo", teniendo un control personalizado que tiene una alineación vertical y horizontal como estiramiento, y luego agregar eso como un elemento secundario del diseño del control actual.
p. Ej.
<Grid x:Name="LayoutRoot" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Rectangle Fill="LightBlue" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.3" />
</Grid>
y luego en el control personalizado
Utilities.UITools.MessageBox x = new Utilities.UITools.MessageBox();
x.SetError(e.Result);
this.LayoutRoot.Children.Add(x);
Dependiendo de lo que tiene que ser visualizado en el modal, que dinámicamente agregar controles a la distribución modal. Claramente, no es una solución elegante, pero al menos funciona.
Eso lo haría modal de alguna manera, pero no parece que sea un bloqueo ya que no hay una llamada a función que se bloquee hasta que el usuario cierre el cuadro de mensaje. –
Lo hice bloqueando al vincular un evento en el cuadro de mensaje. Por lo tanto, bloquea el resto del programa hasta que el evento se dispare – Johannes
Si desea realizar alguna acción en el cierre de la ventana de su hijo, use el siguiente código. Ocultar controles no deseados antes de invocar y muestran el cierre de la ventana secundaria, simple :)
ChildWindow cw = new ChildWindow();
cw.Closed += new EventHandler(cw_Closed);
cw.Show();
Usted podría intentar siempre cancelar el evento de cierre y ajuste la DialogResult más tarde.
void ConfigTemplatePopup_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (tmpDialogResult != null || DialogResult == true) return;
tmpDialogResult = DialogResult; //this is a field
e.Cancel = true;
var myMessageBox = new WspMessageBox("Are you sure you want to close?", true);
myMessageBox.Closed += (s, e2) =>
{
if (wspMessageBox.DialogResult == true)
{
DialogResult = tmpDialogResult;
}else
{
tmpDialogResult = null;
}
};
myMessageBox.Show();
}
Usando async and await in Silverlight 5 puede crear fácilmente un Show método estático que puede estar bloqueando, como
public partial class MyDialog {
MyResultType result;
readonly AutoResetEvent waitHandle;
MyDialog() {
InitializeComponent();
waitHandle = new AutoResetEvent(false);
}
public static Task<MyResultType> Show() {
var dialog = new MyDialog();
dialog.Show();
dialog.Closed += (s, e) => dialog.waitHandle.Set();
return Task<MyResultType>.Factory.StartNew(() => {
dialog.waitHandle.WaitOne(); return dialog.result; });
}
void OkButton_Click(object sender, RoutedEventArgs e) {
result = new MyResultType();
// Initialize result...
Close();
}
}
y llamar al diálogo como
public async void TestDialog() {
var result = await ConfirmBox.Show();
// This code will be performed after the Dialog is closed.
// use result...
}
-1 Me temo, porque este fragmento no compila. La salida de 'Tarea
Este fragmento es de mi proyecto de trabajo. Lo uso como una solución común para los diálogos. Para compilarlo, necesitará el "paquete de orientación asíncrono", que puede agregar a su proyecto usando el nuget. Por favor, lea el artículo usando el enlace en mi respuesta. –
- 1. En c, ¿cómo hacer que un descriptor de archivo bloquee?
- 2. Silverlight ChildWindow para WPF
- 3. removeFromSuperview hace que mi aplicación se bloquee
- 4. ¿Qué condiciones ocasionan que NetworkStream.Write bloquee?
- 5. Cómo evitar que Admob bloquee el subproceso UI
- 6. ¿Qué puede hacer que Visual Studio 2008 se bloquee durante la depuración?
- 7. ¿Qué hace que Windows Firewall bloquee una aplicación?
- 8. Prevenir que Tcl se bloquee en el comando desconocido
- 9. AspNetCompatibilityRequirements hace que el servicio web de WCF bloquee
- 10. ¿Qué hace que IE8 bloquee algunas descargas de archivos?
- 11. ¿Espera a que Scala Future bloquee el hilo?
- 12. Cómo depurar Emacs lisp que hace que Emacs se bloquee/use 100% de CPU?
- 13. ¿Cómo ejecutar mi aplicación incluso después de que la pantalla del iPhone se bloquee?
- 14. Cómo evitar que HTML5 Web Workers se bloquee respondiendo correctamente a los mensajes del padre
- 15. Hacer que el código fuente de un código bloquee la entrada a otro bloque de código en Emacs org-mode
- 16. Cómo dejar que Modal Dialog no bloquee mi segundo nivel superior Marco
- 17. ¿Cómo dejar que jetty bloquee la solicitud al volver a cargar las clases modificadas?
- 18. ¿Cómo podemos evitar que OpenX bloquee la carga de la página?
- 19. ¿Cómo puedo evitar que Visual Studio bloquee los archivos de documentación xml en el directorio bin?
- 20. WinDbg: excepciones de búsqueda que han provocado que un servicio .net se bloquee
- 21. ¿Por qué C# no permite que se bloquee un valor nulo?
- 22. Cómo cerrar una ChildWindow con el botón Cancelar usando MVVM Light Toolkit
- 23. ¿Qué módulo de subprocesamiento debo usar para evitar que el disco IO bloquee la red IO?
- 24. MAC OSX Error de Intel LLVM Assembler (causa que el cargador OGG de Vorbis se bloquee)
- 25. Detener la GUI de pygtk para que no se bloquee durante el proceso de larga ejecución
- 26. Seguir ejecutando una aplicación después de que la pantalla se bloquee automáticamente - Phonegap (Android/iOS)
- 27. compra en aplicación en el simulador de iOS hace que .../usr/libexec/lsd se bloquee
- 28. 100 hilos TIMED_WAITING en tomcat, provocando que se bloquee como el número total de subprocesos 200
- 29. ¿Cómo hacer SMTPHandler no bloquea
- 30. ¿Cómo puedo hacer que Eclipse muestre archivos *.
Podría explicar lo que está tratando de lograr ? – Ray
Solo una ventana de bloqueo modal simple similar a MessageBox.Show() o Form.ShowDialog() –
He intentado todo y nunca encontré una solución. Estaba intentando hacer mi propio MessageBox.Incluso probé la sincronización, pero siempre está bloqueada. Me di por vencido después de leer que Tim Heuer dijo que no era posible tener Modal verdadero. – Paully