WPF日期选择器使分隔符固定且始终可见
我正在开发一个WPF应用程序,希望在其中使用默认的DatePicker控件。我还想让用户手动插入日期,但我想防止用户删除分隔符(“/”)。(更准确地说,即使DatePicker的文本框为“空”,分隔符也应该仍然存在)WPF日期选择器使分隔符固定且始终可见,wpf,datepicker,Wpf,Datepicker,我正在开发一个WPF应用程序,希望在其中使用默认的DatePicker控件。我还想让用户手动插入日期,但我想防止用户删除分隔符(“/”)。(更准确地说,即使DatePicker的文本框为“空”,分隔符也应该仍然存在) 在不创建新的自定义控件的情况下可以完成此操作吗?谢谢大家! 我制作了以下样本: <DatePicker HorizontalAlignment="Left" Margin="132,118,0,0" VerticalAlignment="Top" Width="204" Na
在不创建新的自定义控件的情况下可以完成此操作吗?谢谢大家! 我制作了以下样本:
<DatePicker HorizontalAlignment="Left" Margin="132,118,0,0" VerticalAlignment="Top" Width="204" Name="DatePicker"
SelectedDateChanged="DatePicker_OnSelectedDateChanged">
<DatePicker.Resources>
<Style TargetType="{x:Type DatePickerTextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox x:Name="TextBox1" Grid.Column="0"
Style="{StaticResource DatePickerTextBoxStyle}"
TextChanged="OnTextboxTextChanged1" PreviewTextInput="OnPreviewTextInput1"/>
<Label Grid.Column="1" Content="/" FontSize="18" HorizontalAlignment="Center"/>
<TextBox x:Name="TextBox2" Grid.Column="2" Style="{StaticResource DatePickerTextBoxStyle}"
TextChanged="OnTextboxTextChanged2" PreviewTextInput="OnPreviewTextInput2"/>
<Label Grid.Column="3" Content="/" FontSize="18" HorizontalAlignment="Center"/>
<TextBox x:Name="TextBox3" Grid.Column="4" Style="{StaticResource DatePickerTextBoxStyle}"
TextChanged="OnTextboxTextChanged3" PreviewTextInput="OnPreviewTextInput3"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DatePicker.Resources>
</DatePicker>
这只是一个你如何解决这个问题的例子。它缺乏一些验证,主要是在用于保存年、月和日值的内部文本框中。然而,这是你可能想要的东西
编辑>>>由于我有很多重复的代码,因此必须改进代码隐藏以用于生产。但这只是一个例子
EDIT2>>>>这是它的外观:
不幸的是,经典库没有提供这样做的选项,而且我确信我不是唯一一个想使用带有固定分隔符的日期选择器的人。另一方面,感谢您的回复。实现我想要的行为对我很有用。:)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private static void TrimText(TextBox textbox)
{
textbox.Text = textbox.Text.Trim();
if (textbox.Text.Length == 2) textbox.Text = textbox.Text.PadLeft(2, '0');
textbox.CaretIndex = textbox.Text.Length;
}
private void OnTextboxTextChanged1(object sender, TextChangedEventArgs e)
{
var textbox = sender as TextBox;
if (textbox == null) return;
TrimText(textbox);
if (textbox.Text.Length != 2) return;
var datePickerTxtBox = DatePicker.Template.FindName("PART_TextBox", DatePicker) as DatePickerTextBox;
var secondTxtbox = datePickerTxtBox.Template.FindName("TextBox2", datePickerTxtBox) as TextBox;
secondTxtbox.Focus();
}
private void OnTextboxTextChanged2(object sender, TextChangedEventArgs e)
{
var textbox = sender as TextBox;
if (textbox == null) return;
TrimText(textbox);
if (textbox.Text.Length != 2) return;
var datePickerTxtBox = DatePicker.Template.FindName("PART_TextBox", DatePicker) as DatePickerTextBox;
var thirdTxtbox = datePickerTxtBox.Template.FindName("TextBox3", datePickerTxtBox) as TextBox;
thirdTxtbox.Focus();
}
private void OnTextboxTextChanged3(object sender, TextChangedEventArgs e)
{
var textbox = sender as TextBox;
if (textbox == null) return;
TrimText(textbox);
if (textbox.Text.Length != 2) return;
var datePickerTxtBox = DatePicker.Template.FindName("PART_TextBox", DatePicker) as DatePickerTextBox;
var firstTxtbox = datePickerTxtBox.Template.FindName("TextBox1", datePickerTxtBox) as TextBox;
var secondTxtbox = datePickerTxtBox.Template.FindName("TextBox2", datePickerTxtBox) as TextBox;
DateTime date;
var text = firstTxtbox.Text + secondTxtbox.Text + textbox.Text;
if (!DateTime.TryParseExact(text,"ddMMyy",null,DateTimeStyles.None, out date))
firstTxtbox.Text = secondTxtbox.Text = textbox.Text = string.Empty;
else DatePicker.DisplayDate = date;
}
private void OnPreviewTextInput1(object sender, TextCompositionEventArgs e)
{
e.Handled = !(new Regex("[0-9]+").IsMatch(e.Text));
}
private void OnPreviewTextInput2(object sender, TextCompositionEventArgs e)
{
e.Handled = !(new Regex("[0-9]+").IsMatch(e.Text));
}
private void OnPreviewTextInput3(object sender, TextCompositionEventArgs e)
{
e.Handled = !(new Regex("[0-9]+").IsMatch(e.Text));
}
private void DatePicker_OnSelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
var newDate = DateTime.Parse(e.Source.ToString());
DatePicker.DisplayDate = newDate;
var datePickerTxtBox = DatePicker.Template.FindName("PART_TextBox", DatePicker) as DatePickerTextBox;
var firstTxtbox = datePickerTxtBox.Template.FindName("TextBox1", datePickerTxtBox) as TextBox;
var secondTxtbox = datePickerTxtBox.Template.FindName("TextBox2", datePickerTxtBox) as TextBox;
var thirdTxtbox = datePickerTxtBox.Template.FindName("TextBox3", datePickerTxtBox) as TextBox;
firstTxtbox.Text = DatePicker.DisplayDate.ToString("dd");
secondTxtbox.Text = DatePicker.DisplayDate.ToString("MM");
thirdTxtbox.Text = DatePicker.DisplayDate.ToString("yy");
}
}