Свойство WPF DatePicker IsEnabled не меняет внешний вид - PullRequest
6 голосов
/ 14 апреля 2010

Я думаю, что обнаружил проблему с DatePicker в наборе инструментов, возможно, некоторые из вас, гуру, могут это проверить.

Проблема заключается в установке свойства IsEnabled для DatePicker. Если установлено в XAML, оно остается серым, даже если для IsEnabled установлено значение true во время выполнения. То же самое можно сказать и об обратном, если он будет включен.

Кнопка просто меняет свойство IsEnabled средства выбора даты, и вы увидите, что когда он станет активным, стиль останется серым.

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

Ответы [ 5 ]

7 голосов
/ 14 марта 2011

Я решил эту проблему, явно установив визуальный стиль DatePicker в обработчике 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);
}
4 голосов
/ 02 сентября 2010

Хотите хорошие или плохие новости?

Хорошей новостью является то, что Microsoft говорит, что эта проблема была исправлена ​​в выпуске WPFToolkit в феврале 2010 года. И это имеет.

Плохая новость заключается в том, что, хотя для параметра IsEnabled DatePicker's установлено значение «True» будет включать DatePicker, поэтому вы можете теперь нажать на кнопку «Календарь», чтобы выбрать дату, он все равно будет выглядеть отключенным.

"Жук"? Я сказал слово «жук»?

Конечно, нет.

Вы можете обойти эту проблему, применив <Style>.

Ниже приведен простой код xaml для демонстрации.

Отображает две строки, каждая из которых содержит CheckBox и DatePicker. Когда вы щелкаете CheckBox в строке, он должен включить DatePicker в этой строке.

Показывает разницу между DatePicker без стиля (в первой строке) и DatePicker со стилем (во второй строке).

alt text

Оба DatePickers do включаются / отключаются правильно, но тот, что в первой строке, никогда не выглядит так, как он есть. DatePicker во второй строке использует Style, чтобы показать пользователю, когда он отключен.

Обратите внимание, как этот код устанавливает фон для элемента управления DatePicker и его части 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>

Надеюсь, что поможет!

И я надеюсь, что правильно исправлено в следующем выпуске WPFtoolkit. Пользователи жалуются на эту проблему с 2009 года ...

1 голос
/ 11 марта 2011

Еще один способ подделать стиль «серый / отключенный» - злоупотребить свойством 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>

Просто еще один временный обходной путь до исправления ошибки IsEnabled. выпуск 7904 / выпуск 9641

0 голосов
/ 21 апреля 2010

Кто-нибудь когда-нибудь получал ответ на это? У меня та же проблема с выпуском в феврале 2009 года.

Попробуйте это.
1 / Используйте элемент управления вкладками и поместите указатель даты на первую вкладку, а один - на вторую. 2 / Добавьте кнопку и в событии по щелчку установите для свойства IsEnabled обоих элементов управления datepicker обратное значение (поэтому, если оно было включено, сделайте его отключенным и наоборот).

На первой вкладке с указателем даты будет все в порядке. На втором он будет отключен, но вы все равно сможете открыть календарь и изменить дату.

0 голосов
/ 14 апреля 2010

эта проблема была решена в новом WPFToolkit

...