Установите фокус на текстовое поле в xaml wpf
Несмотря на некоторые сообщения на этом форуме и другие, я не могу найти что-то, что говорит мне, как настроить фокус на TextBox
.
У меня есть userControl со многими ярлыками и текстовыми полями. Когда форма загружена, я хочу, чтобы конкретный текстовый блок имел фокус.
Я установил tabIndex, но это не сработало.
Любые предложения?
Ответы
Ответ 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>
Вы также можете использовать TxtB.Focus()
в коде, если вы не хотите этого делать в XAML.
Ответ 2
Вы можете применить это свойство непосредственно к TextBox:
<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
Ответ 3
Я новичок в использовании 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>
Ответ 4
свяжите элемент, на который вы хотите направить фокус, в
FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"
в сетке или групповом поле и т.д.
Ответ 5
FocusManager не был в intellisense, и это немного смутило меня. Я просто набрал весь атрибут, и он сработал.
FocusManager.FocusedElement = "{Binding ElementName = MyTextBox}"
Microsoft Visual Studio Enterprise 2015 версия 14.0.23107.0/C#/WPF
Ответ 6
Для полноты также есть способ справиться с этим из кода (например, в случае элементов управления, которые по какой-либо причине создаются динамически и не существуют в XAML). Прикрепите обработчик к окну Загруженное событие, а затем используйте метод ".Focus()" элемента управления, который вы хотите. Ниже приведен пример Bare-bones.
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();
}
}
Ответ 7
В моем случае предоставленные ответы не сработали. Где-то в коде после InitializeComponent();
Я должен был добавить
MyTextBox.Focus();
и это работает.
Ответ 8
Из экспериментов вокруг, решение XAML
FocusManager.FocusedElement="{Binding ElementName=yourElement}"
кажется, работает лучше всего, когда вы помещаете его в самый высокий элемент в иерархии окон (обычно это Window или Grid, в который вы помещаете все остальное)