Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinRT XAML并以编程方式将焦点设置为文本框-为什么焦点不';不粘?_C#_Winrt Xaml - Fatal编程技术网

C# WinRT XAML并以编程方式将焦点设置为文本框-为什么焦点不';不粘?

C# WinRT XAML并以编程方式将焦点设置为文本框-为什么焦点不';不粘?,c#,winrt-xaml,C#,Winrt Xaml,我的Windows8XAML页面包含两个控件:图像和文本框。当用户双击图像时,我想将焦点移动到文本框,以便自动显示虚拟键盘 问题:TextBox控件正确接收焦点,但仅持续0.1秒。然后焦点移动到其他地方,不显示键盘 通过这些事件,我可以看到文本框引发了GotFocus和LostFocus事件。Image控件没有其他事件处理程序,因为它只处理双击事件: private void CurrentPage_OnDoubleTapped(object sender, DoubleTappedRo

我的Windows8XAML页面包含两个控件:图像和文本框。当用户双击图像时,我想将焦点移动到文本框,以便自动显示虚拟键盘

问题:TextBox控件正确接收焦点,但仅持续0.1秒。然后焦点移动到其他地方,不显示键盘

通过这些事件,我可以看到文本框引发了GotFocus和LostFocus事件。Image控件没有其他事件处理程序,因为它只处理双击事件:

    private void CurrentPage_OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
    {
        e.Handled = true;
        this.PageNumberTextBox.Focus(FocusState.Keyboard);
    }
为什么焦点不“粘住”?焦点在哪里?为什么

更新:

使用,我可以看到焦点移到了ScrollViewer[Windows.UI.Xaml.Controls.Border]。我认为这是内置的(可能被RootFrame使用),因为我没有向页面添加任何ScrollViewer,因为这个控件似乎占据了整个屏幕

因此,问题似乎是由事件冒泡引起的:图像控件首先接收事件,然后接收事件后面的控件。但是为什么呢?难道不应该阻止这种行为吗

修改代码使其看起来像这样没有帮助:

    private void CurrentPage_OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
    {
        e.Handled = true;
        //this.PageNumberTextBox.Focus(FocusState.Keyboard);
    }
双击后,神秘滚动查看器将获得焦点

更新2:

问题可能与图像控制有关。我创建了以下spike:

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Image Grid.Row="0" DoubleTapped="UIElement_OnDoubleTapped" Tapped="UIElement_OnTapped"
           Source="http://upload.wikimedia.org/wikipedia/commons/1/1c/Squirrel_posing.jpg" Stretch="Fill"/>
    <TextBox x:Name="MyBox" Grid.Row="1"/>
</Grid>
问题是:当我点击图像时,焦点总是被赋予这个神秘的滚动查看器。以下是一些屏幕截图:

  • 单击占据视图下半部分的文本框时,焦点将正确移动到文本框(带焦点的控件将高亮显示,控件名称显示在左上角):
  • 当我单击顶部的图像时,该图像没有接收到焦点。取而代之的是神秘的ScrollViewer,它似乎占据了整个屏幕:

  • 因此,即使我已将图像设置为同时处理点击和双击,图像控件也不会接收焦点。

    我认为您的问题在于双击是在一系列事件中发生的,这些事件最终会改变焦点。您可以尝试通过异步调用focus方法将焦点更改“排队”。例如:

    Task.Factory.StartNew(
        () => Dispatcher.RunAsync(CoreDispatcherPriority.Low,
            () => PageNumberTextBox.Focus(FocusState.Keyboard)));
    

    我知道这看起来有点愚蠢,但这样做的目的是尝试在队列中的所有其他事件之后放置更改焦点的代码。

    使用Aweasome helper类查看焦点的位置。感谢您提供的提示。我添加了更多信息,可以通过此帮助程序收集这些信息。您的文本框是否启用了文本换行功能?如果是这样的话,可能是一个内部滚动查看器(它被创建来处理多行文本的滚动)获得了焦点。没有启用包装。我创建了一个空的spike,并用几个屏幕截图更新了问题,这些截图似乎突出了问题:图像控件似乎总是在事件中冒泡。谢谢你的提示!仅此一点并不能奏效,但在Dispatcher.RunAsync开始工作之前添加了Task.Delay(200)之后。
    Task.Factory.StartNew(
        () => Dispatcher.RunAsync(CoreDispatcherPriority.Low,
            () => PageNumberTextBox.Focus(FocusState.Keyboard)));