Я думаю, вам может понадобиться запустить полный контроль исходного кода и настроить его. Проблема в том, что текст обновляется в событии TextChanged:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (this._textBox != null)
{
this.SetValueNoCallback(TextProperty, this._textBox.Text);
}
}
Таким образом, к тому времени, когда вы получите потерянный код фокуса, значение уже будет установлено. Я смог обойти это, используя подклассы, но так как TextChanged обрабатывает каждое изменение, я не уверен, что ваш метод синтаксического анализа будет работать (так как, как только вы нажмете 1 число, он будет изменен на дату).
public class CustomDatePicker : DatePicker
{
private TextBox textBox;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
textBox = this.GetTemplateChild("TextBox") as TextBox;
if (textBox != null)
textBox.TextChanged += textBox_TextChanged;
}
void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (textBox.Text == "now")
{
// I have also tried with
// this.SelectedDate/DisplayDate = result;
textBox.Text = DateTime.Now.ToShortDateString();
}
}
}
Это работает для меня, так как ничего не меняется, пока не будет написано все слово, но в вашем случае это, вероятно, не сработает.