Установите фокус на текстовое поле в xaml wpf - PullRequest
87 голосов
/ 20 мая 2010

Несмотря на некоторые сообщения на этом форуме и другие, я не могу найти то, что говорит мне, как установить фокус на TextBox.

У меня есть пользовательский элемент управления со многими ярлыками и текстовыми полями. Когда форма загружена, я хочу, чтобы конкретный текстовый блок имел фокус.

Я установил tabIndex, но это не сработало.

Есть предложения?

Ответы [ 7 ]

170 голосов
/ 20 мая 2010

Вы можете использовать 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.

27 голосов
/ 12 апреля 2013

Вы можете применить это свойство непосредственно к TextBox:

<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
6 голосов
/ 14 января 2017

Я новичок в использовании 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 голосов
/ 26 января 2019

Из экспериментов вокруг, решение xaml

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

, кажется, работает лучше всего, когда вы помещаете его в самый высокий элемент в иерархии окон (обычно это окно или сетка, в которую вы помещаете все остальное)

0 голосов
/ 10 ноября 2016

Для полноты, есть также способ справиться с этим из кода позади (например, в случае элементов управления, которые по какой-либо причине создаются динамически и не существуют в 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 голосов
/ 08 июня 2016

FocusManager не был в intellisense, и это немного смутило меня. Я просто набрал весь атрибут, и это сработало.

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


Microsoft Visual Studio Enterprise 2015 версия 14.0.23107.0/C#/WPF

0 голосов
/ 31 октября 2014

привязать элемент, на который вы хотите направить фокус, как

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

в сетке или групповом поле и т. Д.

...