我写了一个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.
也许这是一个新功能^^
答案 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)
您的代码仍然有效,我没有看到任何错误。