WPF DatePicker IsEnabled属性不更改外观

时间:2010-04-14 06:47:45

标签: wpf styles datepicker toolkit isenabled

我认为我在工具包中发现了DatePicker的问题,也许你们中的一些大师可以查看它。

问题在于设置IsEnabled的{​​{1}}属性。如果在XAML中设置,即使在运行时将DatePicker设置为true,它也会保持灰色。如果它开始启用,反过来也是如此。

该按钮只会更改日期选择器的IsEnabled属性,您会看到启用后,样式仍为灰色。

IsEnabled

5 个答案:

答案 0 :(得分:7)

我通过在IsEnabledChanged处理程序中显式设置DatePicker的视觉样式来解决这个问题:

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

答案 1 :(得分:4)

你想要好消息还是坏消息?

好消息是,微软表示此问题已在2010年2月发布的WPFToolkit中得到修复。它有。

坏消息是,尽管将DatePicker的IsEnabled值设置为“True”启用DatePicker,因此 现在可以点击“日历”按钮来选择日期,它仍然看起来已禁用。

“虫子”?我说过“bug”这个词了吗?

当然不是。

您可以通过应用<Style>解决此问题。

下面是一些简单的xaml代码来演示。

它显示两行,每行包含一个CheckBox和一个DatePicker。 当您单击一行中的CheckBox时,它应该启用该行中的DatePicker。

这显示了没有Style的DatePicker(在第一行中)和带有Style的DatePicker(在第二行中)之间的区别。

alt text

正确启用/禁用了DatePickers ,但第一行中的那个看起来并不像是一样。第二行中的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年以来,用户一直在抱怨这个问题......

答案 2 :(得分:1)

伪造“灰色/禁用”风格的另一种方法是滥用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”错误得到修复。 issue 7904 / issue 9641

答案 3 :(得分:0)

有没有人得到这个答案?我在2009年2月的发布中遇到了同样的问题。

试试这个。
1 /使用选项卡控件并在第一个选项卡上放置一个日期选择器,在第二个选项卡上放置一个。 2 /添加一个按钮,在on click事件中将两个datepicker控件的IsEnabled属性设置为反向值(如果它已启用,则禁用它,反之亦然)。

在第一个标签上,日期选择器就可以了。在第二个,它将显示为禁用,但您仍然可以打开日历并更改日期。

答案 4 :(得分:-1)

此问题已在新的WPFToolkit中解决