【问题标题】:Set focus on textbox in WPF在 WPF 中的文本框上设置焦点
【发布时间】:2010-11-23 15:25:02
【问题描述】:

如何在 WPF 中将焦点设置在 TextBox 元素上

我有这个代码:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

...但它不起作用。

有什么想法吗?

【问题讨论】:

  • txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID);它有效,但就是这样。

标签: c# .net wpf textbox focus


【解决方案1】:

试试FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)

【讨论】:

  • 如果你要设置焦点的元素父元素o.O怎么办?
  • FocusManager.SetFocusedElement(FocusManager.GetFocusScope(parentElement), parentElement);
【解决方案2】:
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

上只能有一个元素 具有键盘焦点的整个桌面。 在 WPF 中,有键盘的元素 焦点将设置 IsKeyboardFocused 为真。

您可以在设置行之后中断并检查IsKeyboardFocused 属性的值。还要检查你是否真的到达了那条线,或者你是否设置了一些其他元素来获得焦点。

【讨论】:

    【解决方案3】:

    在 XAML 中:

    <StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
       <TextBox Name="Box" />
    </StackPanel>
    

    【讨论】:

    • 我更喜欢这种方法而不是上面的其他方法,因为它与 MVVM 保持一致。
    • 焦点元素是只读的,如何在 xaml 中设置?我使用了它,但它不起作用
    • @user841612,检查以下链接并验证程序集和命名空间msdn.microsoft.com/en-us/library/…
    • 这只能工作一次。如果您想在页面构建后更改焦点,则需要以编程方式进行。
    • 这也有效。 txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID);
    【解决方案4】:

    试试这个:MyTextBox.Focus ( );

    【讨论】:

    • 这是最优雅的答案,它也不需要您指定父级。谢谢你,它对我很有用!
    • Peter Huber 的回答这样做了,但解释说需要先加载窗口,这就是我的不工作的原因
    【解决方案5】:

    这些都对我不起作用,因为我使用的是网格而不是 StackPanel。

    我终于找到了这个例子: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

    并将其修改为:

    在“资源”部分:

        <Style x:Key="FocusTextBox" TargetType="Grid">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    

    在我的网格定义中:

    <Grid Style="{StaticResource FocusTextBox}" />
    

    【讨论】:

    • 这对我也有用。其余的不是。感谢您的链接,这很有趣。同样有趣的是,这么简单的事情可以这么复杂。
    • 无论容器是 Gird 还是 StackPanel,上述答案都可以正常工作。由于您的网格结构不清楚,因此很难判断可能出了什么问题。不过很高兴看到替代品。
    • 对我来说,这也是唯一可以正常工作的。不错的方式。
    【解决方案6】:

    到目前为止,没有人解释为什么问题中的代码不起作用。我的猜测是代码放在了Window的构造函数中。但此时确定重点还为时过早。一旦窗口准备好进行交互,就必须这样做。代码最好的地方是Loaded事件:

    public KonsoleWindow() {
      public TestWindow() {
        InitializeComponent();
        Loaded += TestWindow_Loaded;
      }
    
      private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
        txtCompanyID.Focus();
      }
    }
    

    【讨论】:

    • 逻辑上是正确的,经过太多的努力,这个答案是非常好的和完美的解决方案。
    • 这对我有用。接受的答案没有。谢谢
    • 不确定是否特定于版本,但Focus() 需要焦点状态参数 - 例如txtCompanyId.Focus(FocusState.Keyboard)
    【解决方案7】:

    另一种可能的解决方案是使用free DevExpress MVVM Framework提供的FocusBehavior

    <TextBox Text="This control is focused on startup">
        <dxmvvm:Interaction.Behaviors>
            <dxmvvm:FocusBehavior/>
        </dxmvvm:Interaction.Behaviors>
    </TextBox>
    

    它允许您在加载、引发特定事件或更改属性时聚焦控件。

    【讨论】:

      【解决方案8】:

      如果您还没有找到其他答案的解决方案,这就是我解决问题的方法。

      Application.Current.Dispatcher.BeginInvoke(new Action(() =>
      {
          TEXTBOX_OBJECT.Focus();
      }), System.Windows.Threading.DispatcherPriority.Render);
      

      据我了解,其他解决方案可能不起作用,因为在应用程序呈现其他组件之前调用了对 Focus() 的调用。

      【讨论】:

      • 这个答案值得更高的排名。
      【解决方案9】:

      在后面的代码中,你只能通过这样做来实现它。

       private void Window_Loaded(object sender, RoutedEventArgs e)
              {
                  txtIndex.Focusable = true;
                  txtIndex.Focus();
              }
      

      注意:在加载窗口之前它不会工作

      【讨论】:

        猜你喜欢
        • 2010-10-10
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        相关资源
        最近更新 更多