我认为我在工具包中发现了DatePicker
的问题,也许你们中的一些大师可以查看它。
问题在于设置IsEnabled
的{{1}}属性。如果在XAML中设置,即使在运行时将DatePicker
设置为true,它也会保持灰色。如果它开始启用,反过来也是如此。
该按钮只会更改日期选择器的IsEnabled
属性,您会看到启用后,样式仍为灰色。
IsEnabled
答案 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(在第二行中)之间的区别。
正确启用/禁用了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中解决