2008-11-07 22 views
13

Tengo un montón de controles en mi ventana. Uno de ellos es un botón de actualización que realiza una tarea engorrosa en un hilo de fondo.Deshabilitar todos menos un control secundario en una ventana de WPF

Cuando el usuario hace clic en el botón de actualización, coloco el cursor en estado de espera (reloj de arena) y desactivo la ventana completa - Me.IsEnabled = False.

Me gustaría apoyar la cancelación de la acción de actualización al permitir que el usuario haga clic en un botón de cancelar, pero no puedo facilitarlo mientras toda la ventana está desactivada.

¿Hay alguna manera de hacer esto además de deshabilitar cada control (excepto el botón cancelar) uno por uno y luego volver a habilitarlos uno por uno cuando el usuario hace clic en cancelar?

+0

Parece que no puedo usar Me.IsEnabled y Me.Cursor. http://stackoverflow.com/questions/762396/wpf-wait-cursor-with-backgroundworker-thread –

Respuesta

19

Se puede retener todos los controles en un panel (Cuadrícula, StackPanel, etc.), y dejar el botón de cancelación en otro panel. Luego configure la propiedad IsEnabled del otro panel.

En la práctica, esto probablemente introducirá más de un panel adicional.

Por ejemplo, si usted tenía un StackPanel de botones, puede agregar un StackPanel adicional:

<StackPanel Orientation="Horizontal"> 
    <StackPanel x:Name="controlContainer" Orientation="Horizontal"> 
     <!-- Other Buttons Here --> 
    </StackPanel> 
    <Button Content="Cancel" /> 
</StackPanel> 

A continuación, lleve a cabo lo siguiente para desactivar todo menos el botón de cancelación:

controlContainer.IsEnabled = false; 
+0

StackPanel no tiene una propiedad IsEnabled en WP8 – radders

+0

Bueno, he hecho 0 trabajar con WP8, pero encontré los documentos para el WP8 'StackPanel': http://msdn.microsoft.com/en-US/library/ windows/apps/windows.ui.xaml.controls.stackpanel.aspx Supongo que está utilizando esa API, y no la de Silverlight, ya que Silverlight tiene una propiedad 'IsEnabled'. Si bien no obtendrás el aspecto exacto de los controles deshabilitados, siempre puedes configurar 'IsHitTestVisible =" false "' para deshabilitar la entrada en 'controlContainer'. De lo contrario, podría tener una superposición semitransparente que haga visible cuando desee deshabilitar los otros controles (y use una 'Grilla' como panel exterior). –

3

Puede vincular los datos de cada propiedad IsEnabled de los controles a su propiedad de dependencia booleana personalizada que señala cuándo su aplicación está bloqueada. Simplemente no enlace el botón cancelar.

Como mencionó Donnelle Puede configurar enlaces múltiples con un convertidor. Aquí hay algunos ejemplos a los que puedes referirte. WPF MultiBinding with Converter Implementing Parameterized MultiBinding Sample

+0

El único problema que tengo con w/es que la propiedad IsEnabled en algunos de mis controles ya está vinculada a una propiedad booleana para otros fines –

+1

Puede usar un enlace múltiple con un convertidor. Hay ejemplos alrededor de cómo hacer un genérico con un parámetro para comportamientos AND u OR. – Donnelle

5

También quería que el usuario pudiera cancelar la carga. Encontré una solución encantadora.

foreach (Control ctrl in this.Controls) 
    ctrl.Enabled = false; 

CancelButton.Enabled = true; 

Esto también permite que la ventana principal para seleccionar y mover a diferencia this.Enabled = false; que bloquea completamente la ventana.

+0

El control no tiene una propiedad IsEnabled en WP8 – radders

Cuestiones relacionadas