我正在向我的表单添加一个WPF DatePicker
控件,它可以正常工作。但是我不希望用户能够在“选择日期”文本框中输入任何内容。我希望该文本框为只读,并且当他们单击该文本框时,只需打开日历即可。
我不确定属性中是否有此选项?我找不到任何东西...
我正在向我的表单添加一个WPF DatePicker
控件,它可以正常工作。但是我不希望用户能够在“选择日期”文本框中输入任何内容。我希望该文本框为只读,并且当他们单击该文本框时,只需打开日历即可。
我不确定属性中是否有此选项?我找不到任何东西...
<DatePicker HorizontalAlignment="Left" VerticalAlignment="Top">
<DatePicker.Resources>
<Style TargetType="DatePickerTextBox">
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="Text" Value=" "/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="IsEnabled" Value="False" />
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
</DatePicker.Resources>
</DatePicker>
未来,您可以使用WPF可视化工具查看顶层控件正在使用哪些子控件(在本例中为DatePickerTextBox),然后在资源部分应用样式和/或模板到该类型,就像我在这里所做的那样。
DatePicker
的模板,并放大按钮的大小,以便它可以重叠在文本框上:然后您就完成了,当您单击文本框时,事件将传递给按钮。请参阅下面修改后的DatePicker
模板的部分内容:<DatePickerTextBox Grid.Row="0" Grid.Column="0" x:Name="PART_TextBox" Focusable="{TemplateBinding Focusable}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"/>
<Button Grid.Row="0" Grid.Column="0" x:Name="PART_Button" Foreground="{TemplateBinding Foreground}" Focusable="False" >
<Button.Template>
<ControlTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Background="Transparent"/>
<Button Grid.Column="1" HorizontalAlignment="Left" Foreground="{TemplateBinding Foreground}" Template="{StaticResource DropDownButtonTemplate}" VerticalAlignment="Top" Width="20" Margin="3,0,3,0" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
DatePickerTextBox
样式。
<DatePicker Name="datePicker" Focusable="False">
<DatePicker.Resources>
<Style TargetType="DatePickerTextBox">
<EventSetter Event="MouseLeftButtonUp" Handler="OnMouseLeftButtonUp" />
</Style>
</DatePicker.Resources>
</DatePicker>
private void OnMouseLeftButtonUp(object sender, RoutedEventArgs e)
{
datePicker.IsDropDownOpen = true;
}