2010-04-14 10 views
6

Penso di aver trovato un problema con il DatePicker nel toolkit, forse alcuni di voi guru può check it out.proprietà WPF DatePicker IsEnabled non cambiare aspetto

Il problema si verifica quando si imposta la proprietà di DatePicker. Se impostato in XAML, rimane grigio anche se si imposta IsEnabled su true in fase di esecuzione. Lo stesso vale per il contrario, se dovesse iniziare con l'abilitazione.

Il pulsante modifica semplicemente la proprietà del selettore di date, vedrete che quando viene abilitato, lo stile rimane grigio.

<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

Hai trovato una soluzione a questo problema? –

+0

No, tutto quello che posso dire è che succede sul mio desktop, ma non sul mio portatile, l'ho notato l'altro giorno quindi non è su tutte le macchine. – Jonathan

+0

Posso confermare che sono in grado di riprodurre anche questo problema. Non ho ancora testato DatePicker rilasciato in .NET 4.0, presumo che non avremo questo problema anche se potrebbe. – jpierson

risposta

-1

questo problema è stato risolto nella nuova WPFToolkit

+0

Nel toolkit di febbraio? – Jonathan

+0

stiamo usando la versione di giugno 2009. –

+2

Bene questo è nel toolkit di latests che risale al febbraio 2010 – Jonathan

0

Qualcuno ha mai ottenere una risposta a questo? Sto avendo lo stesso problema con la versione di febbraio 2009.

Prova questo.
1/Utilizzare un controllo struttura a schede e inserire un datario nella prima scheda e uno nel secondo. 2/Aggiungi un pulsante e nell'evento su clic imposta la proprietà IsEnabled di entrambi i controlli datepicker sul valore inverso (quindi se fosse Abilitato, disabilitarlo e viceversa).

Nella prima scheda, la DatePicker andrà bene. Al secondo, apparirà disabilitato ma è ancora possibile aprire il calendario e modificare la data.

+0

Che ne dici di postare un controllo utente che lo astragga per noi? – Jonathan

4

Vuoi le buone notizie o le cattive notizie?

La buona notizia è che Microsoft dice che questo problema è stato risolto nella versione Feb 2010 del WPFToolkit. E ha.

La cattiva notizia è che, anche se il valore di impostazione IsEnabled di un DatePicker su "True" sarà abilitare il DatePicker, in modo da possibile ora fare clic sul pulsante Calendario per scegliere la data, sarà ancora guardare disattivato .

"Bug"? Ho detto la parola "bug"?

Ovviamente no.

è possibile aggirare questo problema applicando una <Style> però.

seguito alcune semplice codice XAML per dimostrare.

Visualizza due righe, ciascuna contenente un CheckBox e un DatePicker. Quando si fa clic su un CheckBox in una riga, dovrebbe abilitare DatePicker in quella riga.

Questo mostra la differenza tra un DatePicker senza stile (nella prima fila), e un DatePicker con uno stile (in seconda fila).

alt text

Entrambi datepickers Do ottenere abilitato/disabilitato in modo corretto, ma quello in prima fila non sembra come se fosse. DatePicker nella seconda riga utilizza uno Style per mostrare all'utente quando è disabilitato.

Nota come questo codice imposta lo sfondo sia del controllo DatePicker sia della parte DatePickerTextBox di esso.

<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> 

Spero che l'aiuto!

E spero che sia corretto corretto nella prossima versione di WPFtoolkit. Gli utenti si sono lamentati di questo problema dal 2009 ...

+0

Non funziona in questa situazione: quando la proprietà DatePicker IsEnabled è associata a un CheckBox.IsChecked ad esempio, se inserisci il codice XAML CheckBox prima di DatePicker, DatePicker rimarrà grigio per sempre. CheckBox quindi non hai alcun problema e la tua soluzione funziona. Mi fa impazzire scoprire quando è successo. –

1

Un altro modo per simulare lo stile "disattivato/disattivato" consiste nell'abusare la proprietà 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> 

Solo un'altra soluzione temporanea fino a quando non viene corretto l'errore "IsEnabled". issue 7904/issue 9641

7

Ho risolto questo impostando esplicitamente lo stile visivo di DatePicker nel gestore 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); 
}