WPF Datepicker 禁用用户输入

Posted

技术标签:

【中文标题】WPF Datepicker 禁用用户输入【英文标题】:WPF Datepicker to disable user input 【发布时间】:2013-05-20 09:05:08 【问题描述】:

我有一个日期选择器,但它允许我输入任何文本。我想禁止用户输入文本。应该允许用户从日历中选择日期。

<Window x:Class="MyTestForDatePicker.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <!--<Grid>-->
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
            <DatePicker Grid.Column="0" Grid.Row="0" Margin="2" Name="MySelectedDate"     VerticalContentAlignment="Center" ></DatePicker>
        <DatePickerTextBox Grid.Column="1" Grid.Row="3" Margin="2" Name="SelectedDate"   IsReadOnly="True"></DatePickerTextBox>
        <Button Grid.Column="1" Grid.Row="1" Margin="100,102,203,154" VerticalContentAlignment="Center" Name="Ok" Click="Ok_Click_1"/>
    </Grid>

【问题讨论】:

为什么不直接用一个只读的文本框打印选中日期的值呢?为什么你需要一个&lt;DatePickerTextBox&gt;,如果它是只读的? 为什么“输入任何文本”有问题? 24 May 2013 是一个完全有效的日期。为什么要惩罚喜欢使用键盘的用户?输入24/5/13 比使用鼠标和选择器控件要快得多。 @CraigYoung:因此您不必费心验证垃圾输入以及可能导致的绑定错误。 @BCA 我不确定您是否正确理解我的评论。问题想要“禁止用户输入文本(句号)”。大多数语言中的大多数现代控件都提供了一种相当简单的方法来验证键盘输入。您是否认为与默认控制行为作斗争而不是询问如何在现有框架内为各种用户提供更好的体验更好? @CraigYoung:我明白你在说什么。但是,在进行 MVVM 数据绑定时,存在由于输入错误(例如“2016-05-a3”)而导致绑定失败的情况,并且视图模型没有意识到此错误,因此无法正确验证。有解决方法,但很复杂。在一些简单的用例中,将用户的选择限制为有效的DateTime 值更有意义。 【参考方案1】:

似乎 DatePicker 上没有属性可以使 TextBox 只读。

试试下面的样式设置

        <DatePicker x:Name="MyDatePicker">
            <DatePicker.Resources>
                <Style TargetType="DatePickerTextBox">
                    <Setter Property="IsReadOnly" Value="True"/>
                </Style>
            </DatePicker.Resources>
        </DatePicker>

【讨论】:

@krishnaaditya RadDatePicker 的解决方案是什么? @krish Ooooh 那是个好地方! @IbrarMumtaz :问题确实指定了“应该允许用户从日历中选择日期”,所以答案仍然非常好。 投反对票。这实际上是行不通的。 “成员 IsReadOnly 无法识别或无法访问。”这是 VS2015 中的 WPF。在 DatePicker 和 Style 中都尝试过。做。不是。工作。 是的,这在 VS 2019 中也不适用于我。但是,确实有效的答案如下。【参考方案2】:

添加属性

Focusable = "False"

到您的日期选择器。这不应该允许用户在 datepicker 文本框中输入任何字符串

<DatePickerTextBox Grid.Column="1" Grid.Row="3" Margin="2" Name="SelectedDate"   IsReadOnly="True" Focusable="False"></DatePickerTextBox>

【讨论】:

这样效果更好。我有一个问题,当我选择日期时会自动选择日期文本,IsReadOnly=True 解决了它。 谢谢,我也有同样的问题,这对我有用。这会阻止文本框,同时仍允许使用日期选择器。【参考方案3】:

IsHitTestVisibleFocusable 属性设置为false

【讨论】:

谢谢!如果您想禁用文本中的输入并禁止用户从日历按钮中进行选择,这就是要走的路! DatePicker 没有 IsReadOnly 属性。【参考方案4】:

这个对我有用(所有日期选择器的全局样式):

<Style TargetType="x:Type DatePickerTextBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <TextBox IsReadOnly="True" x:Name="PART_TextBox" Text="Binding Path=SelectedDate, StringFormat='dd.MM.yyyy', RelativeSource=RelativeSource AncestorType=x:Type DatePicker" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

注意:它还设置了自定义字符串格式。

【讨论】:

【参考方案5】:

不需要对日期选择器设置任何东西,当你离开焦点时,日期选择器会自动删除文本,只有日期保留在文本框中。

【讨论】:

【参考方案6】:

只需将 IsEnabled 设置为 false 即可解决您的问题

【讨论】:

以上是关于WPF Datepicker 禁用用户输入的主要内容,如果未能解决你的问题,请参考以下文章

将 ErrorTemplate 添加到 WPF 用户控件会禁用 TextBox 输入

WPF 4.0 DatePicker 快速录入

Kendo UI for Angular:Kendo UI Datepicker 禁用输入/仅文本框部分

自定义 WPF DatePicker 掩码

Kendo uI datepicker 禁用类型和选择

WPF C# DatePicker 单击时打开日历