1

我写了一个用户控件,其中只有一个形状,并试图让焦点点击它。
它仍然使用 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。
也许这是一个新功能^^

4

2 回答 2

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

于 2013-07-23T20:25:42.907 回答
0

您的代码仍然可以正常工作,我没有发现任何问题。

于 2013-07-22T20:44:09.993 回答