如何在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。
也许这是一个新功能^^
从调试器中,当您单击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