C# 将焦点设置为控件模板内的子元素

C# 将焦点设置为控件模板内的子元素,c#,wpf,xaml,controltemplate,C#,Wpf,Xaml,Controltemplate,我有一个控件模板,用于派生自扩展WPF Toolkit的CheckComboBox控件(几乎与standartComboBox相同)。我试图跟踪在控件的下拉部分打开以修改其某些属性时按下该键的时间。但当我打开下拉菜单并按任意键时,什么也没有发生(断点既不在OnKeyDown内部,也不在OnPreviewKeyDown覆盖的方法内部)。只有在我之前单击下拉部分中的控件时,它们才会开始被击中。那个么,即使子控件并没有焦点,我如何使它们工作,或者当下拉菜单打开时,如何将焦点设置为子控件。对于后者,我尝

我有一个控件模板,用于派生自扩展WPF Toolkit的
CheckComboBox
控件(几乎与standart
ComboBox
相同)。我试图跟踪在控件的下拉部分打开以修改其某些属性时按下该键的时间。但当我打开下拉菜单并按任意键时,什么也没有发生(断点既不在
OnKeyDown
内部,也不在
OnPreviewKeyDown
覆盖的方法内部)。只有在我之前单击下拉部分中的控件时,它们才会开始被击中。那个么,即使子控件并没有焦点,我如何使它们工作,或者当下拉菜单打开时,如何将焦点设置为子控件。对于后者,我尝试在ControlTemplate.Triggers集合中使用trigger,但它既不能使用
{x:Reference ChildControl}
也不能使用
{Binding ElementName=ChildControl}
找到子元素

下面是模板的XAML片段

<ControlTemplate x:Key="MyTemplate" TargetType="{x:Type wpfApplication2:DropDownMultiSelector}">
        <ControlTemplate.Triggers>
            <!--This one doesn't work-->
            <Trigger Property="IsDropDownOpen" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=PART_Popup}" />
            </Trigger>
        </ControlTemplate.Triggers>
        <Grid x:Name="MainGrid" SnapsToDevicePixels="True">
            <Popup x:Name="PART_Popup" AllowsTransparency="True" IsOpen="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom" StaysOpen="False">
                <Grid MinWidth="{Binding ActualWidth, ElementName=MainGrid}">
                    <Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" MaxHeight="{Binding MaxDropDownHeight, RelativeSource={RelativeSource TemplatedParent}}">
                        <ScrollViewer x:Name="DropDownScrollViewer">
                            <Grid RenderOptions.ClearTypeHint="Enabled">
                                <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                    <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=DropDownBorder}" Height="{Binding ActualHeight, ElementName=DropDownBorder}" Width="{Binding ActualWidth, ElementName=DropDownBorder}"/>
                                </Canvas>
                                <ContentControl x:Name="ChildControl" Content="{TemplateBinding ChildItemsControl}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                            </Grid>
                        </ScrollViewer>
                    </Border>
                </Grid>
            </Popup>
            ...

...

列出已加载的事件并设置焦点

下面是一个如何在XAML中处理事件的示例:)



帮助我的是将焦点设置为控制自身,而不是其子控制

<ControlTemplate.Triggers>
    <Trigger Property="IsDropDownOpen" Value="True">
        <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />
    </Trigger>
</ControlTemplate.Triggers>


你试过在代码隐藏中调用Focus()吗?@Bizz不,我没有。我想知道是否有可能从代码中获得对ChildControl的引用?我的意思是,它是逻辑/可视树的一部分吗?我想不是,因为它在Popup中。我不确定它是否有效,但请尝试从ContentControl派生并向其添加dependencyproperty(IsFocused)并将其绑定到IsDropDownOpen。然后为IsFocused添加一个回调函数,其中调用了Focus(),这不是有点脏吗?请这样想。。如果它是脏的,微软不会允许它:)有趣的方法)但对不起,我会尽量避免它做你必须做的事
<ControlTemplate.Triggers>
    <Trigger Property="IsDropDownOpen" Value="True">
        <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />
    </Trigger>
</ControlTemplate.Triggers>