如何在WinRT中关注UserControl

本文关键字:UserControl WinRT | 更新日期: 2023-09-27 18:24:34

我写了一个只有一个形状的UserControl,并试图点击它来获得焦点。
它仍然可以使用tab键获得焦点,但当我点击它时,它不会获得焦点。
即使我编写了一个PointerPressed事件,我用程序设置了焦点,它也不会起作用。

这是xaml:

<UserControl GotFocus="GotFocus" LostFocus="LostFocus" IsTabStop="True">
    <Rectangle x:Name="rect"/>
</UserControl>

代码:

private void GotFocus(object sender, RoutedEventArgs e)
{
    rect.Fill = new Windows.UI.Xaml.Media.SolidColorBrush(Colors.Aqua);
}
private void LostFocus(object sender, RoutedEventArgs e)
{
    rect.Fill = new Windows.UI.Xaml.Media.SolidColorBrush(Colors.Beige);
}

有人有主意吗?

编辑:
我使用的是Windows 8.1和Visual Studio 2013。
也许这是一个新功能^^

如何在WinRT中关注UserControl

从调试器中,当您单击UserControl时,它看起来确实得到了GotFocus事件,但随后立即失去了焦点。它失去焦点的原因似乎是PointerReleased事件继续路由出视觉树并转到根ScrollViewer(所有XAML应用程序在树的根都有一个ScrollViewer,以允许应用程序内容在屏幕键盘显示时滚动)。

我认为这种行为可以被设计考虑。如果您将UserControl放入另一个控件(例如Button)的模板中,则可能希望PointerReleased事件继续在树上向上路由到模板化的父控件(即,按钮点击事件仍然会触发)。

如果您希望UserControl在用户单击它时保持焦点,则需要自己处理PointerReleased事件。添加一个处理程序如下:

XAML:

<UserControl PointerReleased="UserControl_PointerReleased" />

代码背后:

private void UserControl_PointerReleased(object sender, PointerRoutedEventArgs e)
{
    ((UserControl)sender).Focus(FocusState.Pointer);
    e.Handled = true;
}

此处提供示例代码:https://github.com/finnigantime/Samples/tree/master/examples/Win8Xaml/UserControl_FocusExample