C# WPF toolkit TimePicker值在时间手动输入时未更改,但在焦点更改时激发
我正在使用C# WPF toolkit TimePicker值在时间手动输入时未更改,但在焦点更改时激发,c#,wpf,xaml,mvvm,wpftoolkit,C#,Wpf,Xaml,Mvvm,Wpftoolkit,我正在使用wpftoolkit时间选择器 <xctk:TimePicker Name="timePicker" StartTime="{Binding MpStartTime,UpdateSourceTrigger=PropertyChanged}" EndTime="{Binding MpEndTime,UpdateSourceTrigger=PropertyChanged}"
wpftoolkit时间选择器
<xctk:TimePicker Name="timePicker"
StartTime="{Binding MpStartTime,UpdateSourceTrigger=PropertyChanged}"
EndTime="{Binding MpEndTime,UpdateSourceTrigger=PropertyChanged}"
TextBoxBase.TextChanged="TimePicker_TextChanged"
Value="{Binding ResTime,UpdateSourceTrigger=PropertyChanged,Mode="TwoWay"}"
Format="Custom"
FormatString="hh:mm tt"/>
该值似乎发生了变化,但现在我无法在时间选择器中键入任何内容,因为每当文本发生变化时,焦点都会丢失。有什么办法解决这个问题吗 仅供参考,看起来您使用的是来自的变通方法 您所说的是时间选择器中更改的内容:
sender
是TimePicker
控件
好的,那么您将焦点设置为错误的控件。或者,实际上,它对其他人有效,因为它会导致TextBox
的LostFocus
事件(将焦点设置为其他任何选项也可以),但当您想继续使用键盘键入值时则不会
在WPF中,自定义控件通常是复合的,所以我相信在某个地方有一个TextBox
子元素
您可以尝试以下代码:
void TimePicker_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = FocusManager.GetFocusedElement(this) as TextBox;
if (textBox != null)
{
textBox.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
textBox.Focus();
}
}
我们的想法是找到childTextBox
,将焦点传递到其他地方,然后将其设置回原来的位置。这应该会触发TextBox
的LostFocus
事件,如果TimePicker
使用与UpdateSourceTrigger=LostFocus
的绑定,或者如果它处理LostFocus
(我不知道xctk:TimePicker
的具体工作原理)
另一种方法是改变
TextBox.Text的绑定,使UpdateSourceTrigger=PropertyChanged
。如果您可以更改控件模板,这是一种更好的方法。将UpdateRucketRegiger更改为LostFocus
,这样一旦您将焦点移出时间选择器,触发器就会触发。sender
和TimePicker
是相同的文本框吗?@user1672994不,我试过它不起作用。@Sinatrsender
是TimePicker
control感谢您的努力,现在时间选择器内的文本框似乎变得专注了,但不知何故我仍然无法输入。
void TimePicker_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = FocusManager.GetFocusedElement(this) as TextBox;
if (textBox != null)
{
textBox.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
textBox.Focus();
}
}