WPF日期选择器禁用用户输入

15

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

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

为什么不只是使用一个普通的只读文本框,在选定日期后打印日期值呢?如果它将是只读的,为什么需要特别的<DatePickerTextBox>? - qJake
为什么“输入任何文本”是个问题?2013年5月24日是一个完全有效的日期。为什么要惩罚那些喜欢使用键盘的用户呢?用键盘输入24/5/13比用鼠标和选择器控件来回折腾要快得多。 - Disillusioned
@CraigYoung:这样你就不必费力去验证那些垃圾输入,也不用担心会带来的绑定错误。 - BCA
@BCA,我不确定你是否正确理解了我的评论。问题是想要“禁止用户输入文本(句号)”。大多数语言中的现代控件都提供了一种相当简单的方法来验证键盘输入。你认为是更好地尝试打击默认控件行为,还是询问如何在现有框架内工作以为所有类型的用户提供更好的体验呢? - Disillusioned
1
@CraigYoung:我理解你的意思。然而,在进行MVVM数据绑定时,存在一种情况,即由于错误输入(例如“2016-05-a3”)导致绑定失败,而视图模型对此错误没有意识,因此无法正确验证。虽然有一些解决方法,但它们比较复杂。在某些简单的用例中,将用户的选择限制为有效的“DateTime”值更有意义。 - BCA
6个回答

42
似乎DatePicker没有使文本框只读的属性。尝试以下样式设置。
        <DatePicker x:Name="MyDatePicker">
            <DatePicker.Resources>
                <Style TargetType="DatePickerTextBox">
                    <Setter Property="IsReadOnly" Value="True"/>
                </Style>
            </DatePicker.Resources>
        </DatePicker>

@krish 哦,那是个不错的地方! - IbrarMumtaz
部分工作,用户仍然可以点击控件右侧的日期按钮并选择新日期。 - IbrarMumtaz
1
@IbrarMumtaz:问题确实指定了“用户应该被允许从日历中选择日期”,所以答案仍然是完全正确的。 - Pierre Fournier
1
Downvote。这实际上不起作用。“成员IsReadOnly未被识别或无法访问。”这是在VS2015中的WPF。在DatePicker和Style中都尝试过,但都不起作用。 - Scott Shaw-Smith
1
是的,在VS 2019中这个方法也对我无效。然而,有效的答案如下。 - Rick cf
显示剩余2条评论

23

将属性

Focusable = "False"

添加到您的日期选择器中。这将禁止用户在日期选择器文本框中输入任何字符串。

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

这个方法效果更好。我遇到了一个问题,当我选择日期时,日期文本会自动被选中,而 IsReadOnly=True 可以解决这个问题。 - mandarin
谢谢,我有同样的问题,这是对我有用的解决方法。这会阻止文本框的输入,同时仍允许使用日期选择器。 - Rick cf

11

IsHitTestVisibleFocusable属性设置为false


1
如果您想禁用文本输入并禁止用户从日历按钮中进行选择,则可以使用此方法!DatePicker没有IsReadOnly属性。谢谢! - Josh

1
这个对我有用(适用于所有日期选择器的全局样式):
<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>

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

0

不需要设置任何内容到日期选择器,当你失去焦点时,日期选择器会自动删除文本,只有日期保留在文本框中。


-3

只需将IsEnabled设置为false,这样就可以解决您的问题了。


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