如何关注WinRT中的UserControl?

时间:2013-07-22 17:59:48

标签: c# windows-runtime winrt-xaml

我写了一个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和VisualStudio 2013.
也许这是一个新功能^^

2 个答案:

答案 0 :(得分:3)

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

我认为这种行为可以通过设计来考虑。如果将UserControl放在另一个控件(例如Button)的模板中,您可能希望PointerReleased事件继续将树向上路由到模板化父级(即Button.Click事件仍会触发)。

如果您希望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

答案 1 :(得分:0)

您的代码仍然有效,我没有看到任何错误。