单击WPF C#DatePicker打开日历

时间:2013-12-01 22:31:12

标签: c# wpf wpf-controls

我正在向我的表单添加一个WPF DatePicker控件,它工作正常。但我不希望用户能够在“选择日期”文本框中键入类型。我希望它只是readonly,当他们点击文本框时,它只是打开日历。

我不确定这些属性中是否有选项?我找不到任何东西......

3 个答案:

答案 0 :(得分:4)

<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),然后在资源部分中将样式和/或模板应用于该类型,就像我已经完成的那样这里。

答案 1 :(得分:1)

Mark Feldman的回答是写的,他没有回答如何点击文本框打开日历弹出窗口!,

恕我直言,你应该挂钩datPiker的模板,并扩大按钮的大小,使它与文本框重叠,你就完成了,当你点击文本框时,它获取事件的按钮看到下面的一部分Datepiker的修改模板:

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

别忘了添加Mark Feldman答案中描述的DatePickerTextBox风格

答案 2 :(得分:1)

您可以通过以下方式打开日历:

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