2010-04-14 15 views
6

Creo que he encontrado un problema con el DatePicker en el kit de herramientas, tal vez algunos de ustedes los gurús pueden verificarlo.WPF DatePicker IsEnabled propiedad no cambia apariencia

El problema es cuando se configura la propiedad IsEnabled del DatePicker. Si se establece en XAML, permanece gris incluso si configura IsEnabled como verdadero en tiempo de ejecución. Lo mismo ocurre al revés si comienza a habilitarse.

El botón simplemente cambia la propiedad IsEnabled del selector de fecha, verá que cuando se activa, el estilo permanece atenuado.

<Window x:Class="WpfApplication3.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <tk:DatePicker x:Name="txtDate" IsEnabled="False"></tk:DatePicker> 
     <Button Height="25" Click="Button_Click"></Button> 
    </StackPanel> 
</Window> 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    txtDate.IsEnabled = !txtDate.IsEnabled; 
} 
+0

¿Ha encontrado una solución a este problema? –

+0

No, todo lo que puedo decir es que sucede en mi computadora de escritorio, pero no en mi computadora portátil, me di cuenta de esto el otro día, así que no está en todas las máquinas. – Jonathan

+0

Puedo confirmar que soy capaz de reproducir este problema también. No he probado el DatePicker lanzado en .NET 4.0, supongo que uno no tendrá este problema, aunque podría ser. – jpierson

Respuesta

-1

este problema ha sido resuelto en el nuevo WPFToolkit

+0

en el kit de herramientas de Feb? – Jonathan

+0

estamos utilizando el lanzamiento de junio de 2009. –

+2

Bueno, esto está en el kit de herramientas latest que data febrero de 2010 – Jonathan

0

¿Alguien alguna vez obtener una respuesta a esto? Estoy teniendo el mismo problema con el lanzamiento de febrero de 2009.

Pruebe esto.
1/Use un control de pestañas y ponga un marcador de fecha en la primera pestaña y uno en la segunda. 2/Agregue un botón y, en el evento de clic, establezca la propiedad IsEnabled de ambos controles datepicker en el valor inverso (por lo tanto, si está habilitado, desactívelo y viceversa).

En la primera pestaña, el selector de fecha estará bien. En el segundo, aparecerá desactivado pero aún puede abrir el calendario y cambiar la fecha.

+0

¿Qué le parece publicar un control de usuario que lo abstraiga? para nosotros? – Jonathan

4

¿Quieres las buenas o las malas noticias?

La buena noticia es que Microsoft dice que este problema se ha solucionado en la versión de febrero de 2010 de WPFToolkit. Y tiene.

La mala noticia es que, aunque el valor de ajuste IsEnabled de un DatePicker en "True" se permitir que el Selector de fechas, por lo que puede Ahora haga clic en el botón de calendario para seleccionar una fecha, todavía mirar discapacitados .

"Error"? ¿Dije la palabra "error"?

Por supuesto que no.

Puede solucionar este problema aplicando <Style>.

A continuación se muestra un código xaml simple para demostrar.

Muestra dos filas, cada una conteniendo un CheckBox y un DatePicker. Cuando hace clic en una casilla de verificación en una fila, debería habilitar el DatePicker en esa fila.

Esto muestra la diferencia entre un DatePicker sin un estilo (en la primera fila) y un DatePicker con un estilo (en la segunda fila).

alt text

Ambos datepickers do conseguir activado/desactivado correctamente, pero el que está en la primera fila no parece que lo es. DatePicker en la segunda fila usa un Style para mostrar al usuario cuando está deshabilitado.

Observe cómo este código establece el Fondo del control DatePicker y de la parte DatePickerTextBox.

<Window x:Class="WPFDatePickerTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:wpf="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    xmlns:primitives="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit" 
    Title="Window1" Height="317" Width="461"> 
<Window.Resources> 
    <Style TargetType="{x:Type primitives:DatePickerTextBox}"> 
     <Style.Triggers> 
      <Trigger Property="IsEnabled" Value="False"> 
       <Setter Property="Background" Value="Transparent"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
    <Style x:Key="DatePickerStyle1" TargetType="{x:Type wpf:DatePicker}"> 
     <Style.Triggers> 
      <Trigger Property="IsEnabled" Value="False"> 
       <Setter Property="Background" Value="{x:Static SystemColors.InactiveBorderBrush}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <StackPanel> 
     <WrapPanel> 
      <CheckBox Height="16" Name="cbDateOfJoining" Width="120">Date of joining</CheckBox> 
      <wpf:DatePicker Height="25" 
          Name="datePicker1" 
          Width="140" 
          IsEnabled="{Binding IsChecked, ElementName=cbDateOfJoining}" /> 
     </WrapPanel> 
     <WrapPanel> 
      <CheckBox Height="16" Name="cbDateOfLeaving" Width="120">Date of leaving</CheckBox> 
      <wpf:DatePicker Height="25" 
          Name="datePicker2" 
          Width="140" 
          IsEnabled="{Binding IsChecked, ElementName=cbDateOfLeaving}" 
          Style="{DynamicResource DatePickerStyle1}" /> 
     </WrapPanel> 
    </StackPanel> 
</Grid> 
</Window> 

Hope the helps!

Y espero que sea correctamente corregido en la próxima versión de WPFtoolkit. Los usuarios se han quejado de este problema desde 2009 ...

+0

No funciona en esta situación: cuando la propiedad DatePicker IsEnabled está vinculada a un CheckBox.IsChecked por ejemplo, si coloca el código CheckBox XAML antes de DatePicker, DatePicker permanecerá gris para siempre. Si pone DatePicker antes CheckBox no tiene ningún problema y su solución funciona. Me vuelve loco descubrir cuándo ocurrió. –

1

Otra forma de simular el estilo "atenuado/desactivado" es mediante el uso indebido de la propiedad IsHitTestVisible.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:wpf="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    x:Class="CalendarTest.Window1" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" 
    Height="480"> 
<StackPanel> 
    <CheckBox x:Name="IsCalendarEnabled" Content="Is Calendar Enabled" /> 
    <wpf:DatePicker IsHitTestVisible="{Binding ElementName=IsCalendarEnabled, Path=IsChecked}"> 
     <wpf:DatePicker.Style> 
      <Style TargetType="{x:Type wpf:DatePicker}"> 
       <Style.Triggers> 
        <Trigger Property="IsHitTestVisible" Value="False"> 
         <Setter Property="Foreground" Value="#FFB9B9B9" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </wpf:DatePicker.Style> 
    </wpf:DatePicker> 
</StackPanel> 
</Window> 

Otra solución temporal hasta que se soluciona el error "IsEnabled". issue 7904/issue 9641

7

He resuelto esto estableciendo explícitamente el estilo visual de DatePicker en el manejador de IsEnabledChanged:

private void datePicker_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    DatePicker datePicker = sender as DatePicker; 
    if (datePicker.IsEnabled) 
     VisualStateManager.GoToState(datePicker, "Normal", true); 
    else 
     VisualStateManager.GoToState(datePicker, "Disabled", true); 
} 
Cuestiones relacionadas