WPF C#日期选择器单击打开日历

5

我正在向我的表单添加一个WPF DatePicker控件,它可以正常工作。但是我不希望用户能够在“选择日期”文本框中输入任何内容。我希望该文本框为只读,并且当他们单击该文本框时,只需打开日历即可。

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

3个回答

7
<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),然后在资源部分应用样式和/或模板到该类型,就像我在这里所做的那样。


非常感谢您提供的解决方案!如果我遇到类似的问题,我会使用 WPF 可视化工具。 - user2868614
我的日期选择器因为鼠标悬停时打开日历而表现非常奇怪,我在整个互联网上搜索了很久,最终找到了这个解决方法,你救了我的一天,谢谢! - RAMM-HDR

5
马克·费尔德曼的回答部分正确,但他没有回答点击文本框如何打开日历弹出窗口的问题!
您应该钩取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>

不要忘记添加Mark Feldman的回答中描述的DatePickerTextBox样式。

谢谢你。我一直在苦苦挣扎,这是个好的解决方案。 - LuckyLuke82

2
您可以这样打开日历:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接