【问题标题】:Disable focus for control in UWP在 UWP 中禁用控制焦点
【发布时间】:2017-02-09 20:27:44
【问题描述】:

我正在为带有触摸屏的 RPi3 构建 UWP 应用程序。我有一个文本框,我将重点放在页面加载上。如果用户触摸页面上的另一个控件(两个特定按钮除外),我不想失去焦点。我正在使用此文本框进行扫描仪输入。

我尝试为不想获得焦点的控件禁用不同的属性:

AllowFocusOnInteraction="False" IsDoubleTapEnabled="False" IsHitTestVisible="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False"

但是如果我按下这些控件中的任何一个,文本框仍然会失去焦点。

我还尝试了 textbox_LostFocus 的事件处理程序以重新赋予它焦点,但是这会阻止用户单击用户需要单击的 2 个按钮中的一个(唯一应该接收焦点的控件),因为 textbox_LostFocus 事件触发再次将焦点设置回文本框,然后才能触发 button_Click 事件。

在 winform 中,我会禁用 tabstop 属性。对 UWP 有什么想法吗?

提前致谢。

【问题讨论】:

    标签: c# raspberry-pi uwp uwp-xaml


    【解决方案1】:

    IsEnabled property 就是这样做的。如果您不喜欢“变灰”的外观,可以更改控件模板。

    【讨论】:

      【解决方案2】:

      如果你希望你的TextBox不会失去焦点,你应该可以通过LostFocus事件中的Focus方法设置焦点。

      如您所知,如果我们在LostFocus 事件中设置Focus,则不会触发Click 事件。

      所以我们应该能够在您的LostFocus 事件中添加一个if,当用户单击按钮时,文本可能会失去焦点。为此,我们可以添加PointerEntered 事件和PointerExitedButton。在PointerEntered事件中,我们可以设置setFocus的值。

      例如:

      <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
          <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
              <Button Content="Click" AllowFocusOnInteraction="False" IsDoubleTapEnabled="False" IsHitTestVisible="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False"></Button>
              <TextBox Name="MyText" Text="Hello" LostFocus="MyText_LostFocus"></TextBox>
              <Button Name="MyButton" PointerEntered="MyButton_PointerEntered" PointerExited="MyButton_PointerExited" Click="Button_Click" Content="Submit"></Button>
          </StackPanel>
      </Grid>
      

      后面的代码:

      private bool setFocus = true;
      
      private void MyText_LostFocus(object sender, RoutedEventArgs e)
      {
          if (setFocus == true)
          {
              MyText.Focus(FocusState.Programmatic);
          }
      }
      
      private void Button_Click(object sender, RoutedEventArgs e)
      {
          MyButton.Focus(FocusState.Programmatic);
      }
      
      private void MyButton_PointerEntered(object sender, PointerRoutedEventArgs e)
      {
          setFocus = false;
      }
      
      private void MyButton_PointerExited(object sender, PointerRoutedEventArgs e)
      {
          setFocus = true;
      }
      

      【讨论】:

        【解决方案3】:

        我遇到了和你类似的问题。

        我的解决方案是将根视觉元素 (ScrollViewer) 属性 AllowFocusOnInteraction 设置为 false:

        var rootScrollViewer = GetVisualRootElement();
        rootScrollViewer.AllowFocusOnInteraction = false;
        

        我的可视化树如下所示:ScrollViewer->Border->Frame->MainPage->StackPanel->etc...

        下一步是将 AllowFocusOnInteraction 设置为 True 以允许您关注交互的控件(TextBox、CheckBox 等...)。

        最好的问候,

        亚当

        【讨论】:

          【解决方案4】:

          在您不想关注的按钮上,尝试将IsTabStop 属性设置为false

          【讨论】:

          • (这个属性也在UWP中)
          • IsTabStop “指示控件是否包含在选项卡导航中。” 换句话说,它控制键盘导航。这不是问题要问的。
          • 哦,我以为他的意思是键盘焦点,因为如果按钮没有焦点,就不可能按下按钮,他还说在 winforms 中他会使用 isTabStop 属性,所以我只是指出这一点也可以在 uwp 中使用
          • 另外,另一种解决方案是将焦点重新设置在按钮的 clickhandler 中的 textview 上
          • 再一次,这不是 OP 所要求的。他们明确允许这两个按钮控件获得焦点。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-22
          • 2016-08-05
          • 2011-03-22
          • 1970-01-01
          • 1970-01-01
          • 2010-09-30
          • 2017-02-24
          相关资源
          最近更新 更多