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


91

尽管在这个论坛上有一些帖子,还有一些我找不到可以告诉我如何把重点放在博客上的东西TextBox

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

我已经设置了tabIndex,但是似乎没有用。

有什么建议?


Answers:


177

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

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

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


13
@TarkaDaal:“它对我没有用”的评论可能会更加详细。这可能是另一个控件失去了焦点。当WPF中的焦点战开始时,事情往往变得顽皮!请验证您的控件以及您当前在视觉树中的位置(例如,在ComboBox模板内部,这将无效,并且还有许多其他情况)。如果找不到盗窃者,请在加载控件时使用行为或代码隐藏将焦点设置为控件。
Julien Lebosquain

@JulienLebosquain:这是一个非常简单的控件,两个按钮和一个位于Grid中的文本框(我在其中放置了FocusManager东西)。最后,我在后面的代码中做到了。
TarkaDaal

成员“ FocusedElement”未被识别或无法访问。:( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/...
亨迪Irawan

@HendyIrawan也许这是一个Silverlight项目吗?
MojoFilter

@MojoFilter这是Windows Phone 8 WPF项目
Hendy Irawan 2014年

28

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

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

16
不适用于我,在容器上设置FocusManager.FocusedElement =“ {Binding ElementName = TxtB}”确实有效
Grant

1
就像吊饰一样工作,不需要任何命名。
西蒙·马特斯

1
也没有为我工作。我们错过了什么吗?
BrunoLM 2015年

1
也不适合我 Julien Lebosquain工作的建议。
Crypt32 '16

1
也不适合我。建议的所有其他方法也不起作用。这个问题必须是基本的,应该可以轻松解决。这就是为什么许多人不喜欢wpf的原因。
IgorStack

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>

0

绑定您想要将焦点指向的元素

FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"

在网格或组框等


4
嗯,是的,谢谢大家提供的相同答案... 4年后...
Adam Plocher 2015年

4
@AdamPlocher不错,您让Sulfian永久退出了Stack Overflow。“欢迎堆栈溢出”消息会更合适。
Contango

2
@Contango:“最后一次看到Nov 11 '14”。他长了亚当发表他的评论:)之前
飘编码

0

FocusManager并不智能,这让我有些困惑。我只输入了整个属性,它就起作用了。

FocusManager.FocusedElement =“ {Binding ElementName = MyTextBox}”


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


0

为了完整起见,还有一种方法可以从后面的代码中处理此问题(例如,由于某种原因而动态创建且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();
    }
}

0

通过实验,xaml解决方案

FocusManager.FocusedElement="{Binding ElementName=yourElement}"

将其放置在窗口层次结构中的最高元素(通常是“窗口”或放置其他所有内容的网格)中时,效果似乎最好


0

用法: 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);
    }

0

我在DataTemplate内的网格中有一个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();
    }
}

它开始工作,并且插入符在TextBox中可见。我认为必须给FocusScope焦点,FocusManager.FocusedElement属性才能起作用。

杰瑞

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.