将焦点转移到wpf中控件的子部分(在其模板中)

Dav*_*vid 1 wpf xaml focus controltemplate

我有一个textBox需要在某些情况下"转换"为DatePicker.

轻松完成模板:

<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>
Run Code Online (Sandbox Code Playgroud)

然后:

<ControlTemplate x:Key="DateTextBoxTemplate" TargetType="TextBox">
    <DatePicker x:Name="DateContent"
                Text="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Text, Mode=TwoWay}" />
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

问题是:当我点击它时,焦点不会"转移"到日期选择器.

即:如果我点击控件,则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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这并不能让我满意,因为我很确定有一种方法可以在xaml中完成所有操作而我只是不知道它.

我发现另一个问题提到了这个FocusManager.FocusedElement="{Binding ElementName=DateContent}"选项,但我不知道我可以把这段代码放在哪里:它不能添加到controlTemplate(我怀疑),如果我把它放在封装datePicker的网格中模板,它基本上没用.

我只能在xaml中这样做吗?如果是,怎么样?

Fre*_*lad 5

我过去曾经使用过这款产品

<ControlTemplate x:Key="DateTextBoxTemplate" TargetType="TextBox">
    <DatePicker x:Name="DateContent" Text="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Text, Mode=TwoWay}"/>
    <ControlTemplate.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter TargetName="DateContent"
                    Property="FocusManager.FocusedElement"
                    Value="{Binding ElementName=DateContent}" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)