将焦点设置在 xaml wpf 中的文本框上

Posted

技术标签:

【中文标题】将焦点设置在 xaml wpf 中的文本框上【英文标题】:Set the focus on a textbox in xaml wpf 【发布时间】:2011-02-21 18:27:02 【问题描述】:

尽管这个论坛和其他一些帖子我找不到告诉我如何将焦点设置在TextBox 上的内容。

我有一个带有许多标签和文本框的用户控件。加载表单时,我希望特定的文本框具有焦点。

我已经设置了 tabIndex,但这似乎不起作用。

有什么建议吗?

【问题讨论】:

WPF and initial focus的可能重复 【参考方案1】:

您可以为此目的使用FocusManager.FocusedElement 附加属性。这是一段默认将焦点设置为 TxtB 的代码。

<StackPanel Orientation="Vertical" FocusManager.FocusedElement="Binding ElementName=TxtB">
    <TextBox x:Name="TxtA" Text="A" />
    <TextBox x:Name="TxtB" Text="B" />
</StackPanel>

如果您不想在 XAML 中这样做,也可以在代码隐藏中使用 TxtB.Focus()

【讨论】:

@TarkaDaal:“它对我不起作用”的评论可以更详细一点。这可能是另一个控制窃取焦点。当 WPF 中的焦点战开始时,事情往往会变得顽皮!请验证您的控件,以及您当前在可视化树中的位置(例如,在 ComboBox 模板中,这将不起作用,还有许多其他类似的情况)。如果找不到窃取者,请使用行为或代码隐藏在控件加载时将焦点设置为控件。 @JulienLebosquain:这是一个非常简单的控件,一个网格内有两个按钮和一个文本框(这是我放置 FocusManager 的地方)。最后,我在代码隐藏中做到了。 成员“FocusedElement”无法识别或无法访问。 :(plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/… @HendyIrawan 这可能是 Silverlight 项目吗? 我使用的是 WPF 4.5。 FocusManager.FocusedElement 什么都不做。我错过了什么吗?【参考方案2】:

您可以直接在 TextBox 上应用此属性:

<TextBox Text="Binding MyText" FocusManager.FocusedElement="Binding RelativeSource=RelativeSource Self"/>

【讨论】:

对我不起作用,在容器上设置 FocusManager.FocusedElement="Binding ElementName=TxtB" 确实有效 像魅力一样工作,不需要任何命名。 对我也不起作用。我们错过了什么吗? 对我也不起作用。 Julien Lebosquain 工作的建议。 对我也不起作用。提出的所有其他方法也不起作用。这个问题必须是基本的,应该可以轻松解决。这就是为什么许多人不喜欢 wpf。【参考方案3】:

将要指向焦点的元素绑定为

FocusManager.FocusedElement= "Binding ElementName= Comobox1"

在网格或组框等中

【讨论】:

嗯,是的,感谢您给出与其他人相同的答案...... 4 年后...... @AdamPlocher 不错,您将 Sulfian 永久关闭 Stack Overflow。 “欢迎使用堆栈溢出”消息会更合适。 @Contango:“上次看到Nov 11 '14”。在亚当发表评论之前,他早已离开 :)【参考方案4】:

FocusManager 没有智能感知,这让我有点困惑。我刚刚输入了整个属性,它就起作用了。

FocusManager.FocusedElement="Binding ElementName=MyTextBox"


Microsoft Visual Studio Enterprise 2015 版本 14.0.23107.0/C#/WPF

【讨论】:

【参考方案5】:

为了完整起见,还有一种方法可以从后面的代码中处理此问题(例如,在控件的情况下,无论出于何种原因,这些控件都是动态创建的,并且在 XAML 中不存在)。将处理程序附加到窗口的 Loaded 事件,然后使用所需控件的“.Focus()”方法。下面是简单的示例。

public class MyWindow

    private VisualCollection controls;
    private TextBox textBox;

    // constructor
    public MyWindow()
    
        controls = new VisualCollection(this);
        textBox = new TextBox();
        controls.Add(textBox);

        Loaded += window_Loaded;
    

    private void window_Loaded(object sender, RoutedEventArgs e)
    
        textBox.Focus();
    

【讨论】:

【参考方案6】:

我是使用 WPF 的新手,阅读上述示例时我也有类似的经历,尝试使用给出的 xaml 代码示例将焦点设置到文本框,即上述所有示例均无效。

我发现我必须将 FocusManager.FocusElement 放在页面元素中。我认为如果您使用 Window 作为父元素,这可能也会起作用。无论如何,这是对我有用的代码。

 <Page x:Class="NameOfYourClass"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  mc:Ignorable="d"
  Title="Title" 
  Height="720"
  Width="915"
  Background="white"
  Loaded="pgLoaded"
  FocusManager.FocusedElement="Binding ElementName=NameOfYourTextBox">

  <!-- Create child elements here. -->

  </Page>

【讨论】:

【参考方案7】:

通过试验,xaml 解决方案

FocusManager.FocusedElement="Binding ElementName=yourElement"

当您将其放置在窗口层次结构中的最高元素(通常是 Window 或放置其他所有内容的 Grid)中时,似乎效果最佳

【讨论】:

【参考方案8】:

用法: local:FocusManager.FocusOnLoad="True"

    public class FocusManager
    
        public static readonly DependencyProperty FocusOnLoad = DependencyProperty.RegisterAttached(
            "FocusOnLoad",
            typeof(bool),
            typeof(FocusManager),
            new UIPropertyMetadata(false, new PropertyChangedCallback(OnValueChanged))
            );

        private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        
            if (!(sender is Control control))
                return;

            if ((bool) e.NewValue == false)
                return;

            control.Loaded += (s, e) => control.Focus();
        

        public static bool GetFocusOnLoad(DependencyObject d) => (bool) d.GetValue(FocusOnLoad);

        public static void SetFocusOnLoad(DependencyObject d, bool value) => d.SetValue(FocusOnLoad, value);
    

【讨论】:

【参考方案9】:

我在 DataTemplate 内的 Grid 中有一个 TextBox,我希望在它可见时获得键盘焦点。我也发现了

<DataTemplate x:Key="DistanceView" DataType="x:Type vm:ROI">
    <Grid FocusManager.FocusedElement="Binding ElementName=tbDistance">
        <TextBox x:Name="tbDistance" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom"/>
    </Grid>
</DataTemplate>

对我不起作用。

但是当我在父 ContentControl 中调用 Focus() 时

private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)

    if ((sender as ContentControl).IsVisible)
    
        (sender as ContentControl).Focus();
    

它开始工作并且插入符号在文本框中可见。我认为 FocusScope 必须获得焦点才能使 FocusManager.FocusedElement 属性产生任何效果。

杰瑞

【讨论】:

不错的解决方案。这是我必须做的,因为其他答案方法似乎都不起作用。就我而言,我有一组选项卡式表单,并且需要在选项卡可见时设置焦点。

以上是关于将焦点设置在 xaml wpf 中的文本框上的主要内容,如果未能解决你的问题,请参考以下文章

将焦点设置在WPF中的文本框中

如何在使用fancybox打开的新页面中将焦点设置在文本框上

键盘焦点在 ActionScript 中的文本框上

如何将焦点设置在文本框或密码框上

将焦点设置到转发器中的文本框

将插入符号/光标位置设置为字符串值 WPF 文本框的末尾