6

我想我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;
}
4

5 回答 5

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);
}
于 2011-03-14T13:56:13.547 回答
4

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

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

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

“漏洞” ?我说“虫”字了吗?

当然不是。

你可以通过应用一个<Style>虽然来解决这个问题。

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

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

这显示了不带样式的 DatePicker(第一行)和带样式的 DatePicker(第二行)之间的区别。

替代文字

两个 DatePickers可以正确启用/禁用,但第一行中的那个永远不会看起来像。第二行中的 DatePicker 使用 aStyle在禁用时向用户显示。

请注意此代码如何设置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 年以来,用户一直在抱怨这个问题......

于 2010-09-02T08:46:04.967 回答
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”错误之前,这只是另一个临时解决方法。问题 7904 /问题 9641

于 2011-03-11T12:02:15.780 回答
0

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

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

在第一个选项卡上,日期选择器会很好。第二个,它将显示为禁用,但您仍然可以打开日历并更改日期。

于 2010-04-21T10:47:59.020 回答
-1

此问题已在新的 WPFToolkit 中解决

于 2010-04-14T07:53:48.150 回答