gpt4 book ai didi

c# - WinRT XAML 并以编程方式将焦点设置到 TextBox - 为什么焦点不固定?

转载 作者:行者123 更新时间:2023-11-30 12:09:44 24 4
gpt4 key购买 nike

我的 Windows 8 XAML 页面包含两个控件:Image 和 TextBox。当用户双击 Image 时,我想将焦点移动到 TextBox 以便自动显示虚拟键盘。

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

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

    private void CurrentPage_OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
e.Handled = true;
this.PageNumberTextBox.Focus(FocusState.Keyboard);
}

为什么焦点不“固定”?重点在哪里以及为什么?

更新:

this very helpful helper我可以看到焦点移动到 ScrollViewer [Windows.UI.Xaml.Controls.Border]。我认为这是内置的东西(可能被 RootFrame 使用?),因为我没有向页面添加任何 ScrollViewers,而且因为这个控件似乎填满了整个屏幕。

所以,问题似乎是事件冒泡引起的:Image-control是先接收事件,然后是事件背后的control。但为什么? e.Handled = true 不应该阻止这种行为吗?

将代码修改成这样没有帮助:

    private void CurrentPage_OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
e.Handled = true;
//this.PageNumberTextBox.Focus(FocusState.Keyboard);
}

双击后,神秘的 ScrollViewer 获得了焦点。

更新 2:

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

<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>

Spike 应用是使用空白模板创建的。在后面的代码中,我为 Tapped 和 DoubleTapped 设置了 e.Handled = true:

    private void UIElement_OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
e.Handled = true;
}

private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e)
{
e.Handled = true;
}

问题:当我点击图像时,焦点总是给这个神秘的 ScrollViewer。这是一些屏幕截图:

  1. 当我单击占据 View 下半部分的 TextBox 时,焦点正确地移动到 TextBox(具有焦点的控件突出显示并且控件的名称显示在左上角):

Focus textbox

  1. 当我点击顶部的图片时,图片没有获得焦点。相反,它被赋予了神秘的 ScrollViewer,它似乎填满了整个屏幕:

Focus image

因此,即使我已将 Image 设置为同时处理 Tapped 和 DoubleTapped,Image 控件仍未获得焦点。

最佳答案

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

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

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

关于c# - WinRT XAML 并以编程方式将焦点设置到 TextBox - 为什么焦点不固定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20702152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com