首页 > 解决方案 > 如何避免 UWP 中 TextBox 的焦点丢失?

问题描述

我试过什么?

<Grid >
    <Canvas>
        <Canvas x:Name="Gesture" Width="500" Height="500" Background="Gray" AllowFocusOnInteraction="False">
            
        </Canvas>
        <StackPanel x:Name="SidePanel" Canvas.Left="500" Background="LightCyan" Width="100" Height="500">
            <TextBox x:Name="NameBox" Text="Prem" Width="100" Height="35"/>
            <Button Content="But" AllowFocusOnInteraction="False"/>
        </StackPanel>
    </Canvas>
</Grid>

我需要达到什么目标?

当文本框获得焦点时,如果我单击 Button 它不会失去焦点。因为,我设置了 Button 属性 - AllowFocusOnInteraction="False"。

当我在灰色区域(手势画布)内单击时,我需要达到同样的效果。我已经设置了画布属性-AllowFocusOnInteraction="False"。但它不会起作用。

当我在手势画布内单击时,文本框应该是焦点。怎么做?为什么 AllowFocusOnInteraction 在手势画布上不起作用?

标签: uwpuwp-xamlwindows-community-toolkit

解决方案


您可以在事件中设置焦点状态,LostFocus以确保您的 TextBox 不会失去焦点。

您可以处理TextBox的 LostFocus 事件和StackPanel的 Tapped 事件。然后当点击StackPanel时,更改标志值并在LostFocus事件中设置焦点状态

 <StackPanel x:Name="SidePanel" Canvas.Left="500" Background="LightCyan" Width="100" Height="500" Tapped="SidePanel_Tapped">
            <TextBox x:Name="NameBox" Text="Prem" Width="100" Height="35" LostFocus="NameBox_LostFocus"/>
            <Button Content="But" AllowFocusOnInteraction="False"/>
        </StackPanel>

背后的代码

private bool setFocus = true;

 private void NameBox_LostFocus(object sender, RoutedEventArgs e)
    {
        if (setFocus == true)
        {
            NameBox.Focus(FocusState.Programmatic);
        }
    }

    private void SidePanel_Tapped(object sender, TappedRoutedEventArgs e)
    {
        setFocus = true;
    }

推荐阅读