如何让 ContentControl 通过鼠标指针获得焦点?

How to make ContentControl to get Focus by mouse pointer?

我有以下页面

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel x:Name="StackPanel" Background="LightGray">
        <Button x:Name="Button" Content="Button"/>
        <Canvas x:Name="Canvas">
            <ContentControl x:Name="CC">
                <Border Width="100" Height="100" BorderThickness="1" BorderBrush="Red" Background="White"/>
            </ContentControl>
            <ContentControl x:Name="CC2" Canvas.Left="50" Canvas.Top="50">
                <Border Width="100" Height="100" BorderThickness="1" BorderBrush="Blue" Background="White"/>
            </ContentControl>
        </Canvas>
    </StackPanel>
</Page>

我可以按预期使用键盘 (Tab) 在控件之间导航:Button->CC->CC2,它们都生成了 GotFocus/LostFocus 事件。但是当我尝试使用鼠标指针导航时,只有 Button 生成了 GotFocus/LostFocus 事件。我错过了什么?非常感谢。

我可以重现你的问题。 ContenControl 继承了 Control,因此您可以使用 Control.Focus method 在其 PointPressed 事件中获得焦点。

另外,ContentControl会在PointerPressed事件结束后失去焦点,即GotFocus和LostFocus()会不断触发。所以你需要设置 e.Handled = true 来防止 LostFocus() 触发。

例如: 在 Page

的构造函数中
FindName(L"CC").as<UIElement>().PointerPressed([](IInspectable sender, PointerRoutedEventArgs const& args){
  sender.as<Control>().Focus(FocusState::Programmatic);
  args.Handled(true);
});

FindName(L"CC2").as<UIElement>().PointerPressed([](IInspectable sender, PointerRoutedEventArgs const& args){
  sender.as<Control>().Focus(FocusState::Programmatic);
  args.Handled(true);
});