【问题标题】:WPF C# DatePicker open calendar on clickWPF C# DatePicker 单击时打开日历
【发布时间】:2013-12-17 13:24:42
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf datepicker wpf-controls


    【解决方案1】:
    <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 可视化工具。
    【解决方案2】:

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

    您应该钩住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 的样式

    【讨论】:

    • 感谢您。我一直在努力解决这个问题,很好的解决方案。
    【解决方案3】:

    你可以这样打开日历:

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

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 1970-01-01
      • 2017-11-05
      • 2018-06-05
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多