转移焦点在控件的子部分(在其模板中)我有一个文本框需要在某些情况下“转换”到DatePicker中。wpf
容易与模板完成:
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="local:MyTextBox.IsDate" Value="True">
<Setter Property="Template" Value="{StaticResource DateTextBoxTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
然后:
<ControlTemplate x:Key="DateTextBoxTemplate" TargetType="TextBox">
<DatePicker x:Name="DateContent"
Text="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Text, Mode=TwoWay}" />
</ControlTemplate>
麻烦的是:重点不是“转移”到了日期选择器,当我点击它。
即:如果我点击控件,datePicker不会获得焦点。我必须再次点击它才会发生这种情况。
我知道我可以在我背后做代码:
protected override void OnGotFocus(RoutedEventArgs e)
{
base.OnGotFocus(e);
if (IsDate)
{
DatePicker dateContent = Template.FindName("DateContent", this) as DatePicker;
if (dateContent != null) dateContent.Focus();
}
}
但这并不真正满足我,因为我敢肯定有办法做到这一切的XAML和我只是不了解它。
我发现了另外一个提到FocusManager.FocusedElement="{Binding ElementName=DateContent}"
选项的问题,但我不知道我可以在哪里放这段代码:它不能被添加到controlTemplate(正如我怀疑的那样),如果我把它放在一个网格封装在模板中的datePicker,它基本上是无用的。
所以我只能在xaml中做到这一点?如果是,如何?
谢谢,这是我一直在寻找的东西。这不起作用,但稍微调整了一下,我可以让它按照想要的那样行事:触发器最终看起来像这样:(您可以编辑您的答案以供将来参考) –
David
2011-03-01 10:15:41
@大卫:更新我的答案与您的加法 – 2011-03-01 10:23:42
完美,作品一种享受。我想知道为什么需要TargetName =“DateContent”,因为直接在模板对象上设置FocusManager.FocusedElement附加属性的值应该没有什么区别。但我试图将其删除,并打破了行为,所以我认为这是必要的,我无法理解。 – David 2011-03-01 14:16:26