Несмотря на некоторые сообщения на этом и других форумах, я не могу найти что-то, что подсказывало бы мне, как сосредоточить внимание на файле TextBox
.
У меня есть userControl со многими ярлыками и текстовыми полями. Когда форма загружена, я хочу, чтобы конкретный текстовый блок имел фокус.
Я установил tabIndex, но это не сработало.
Какие-либо предложения?
Ответы:
Для этого можно использовать
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.источник
FocusManager
материал). В конце концов, я сделал это в коде программной части.Вы можете применить это свойство непосредственно к TextBox:
<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
источник
Я новичок в использовании 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>
источник
привяжите элемент, на который вы хотите указать фокус, как
FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"
в сетке или групповом ящике и т. д.
источник
Nov 11 '14
". Он ушел задолго до того, как Адам оставил свой комментарий :)FocusManager не входил в состав intellisense, и это меня немного смутило. Я просто набрал весь атрибут, и он сработал.
FocusManager.FocusedElement = "{Binding ElementName = MyTextBox}"
Microsoft Visual Studio Enterprise 2015 версии 14.0.23107.0/C#/WPF
источник
Для полноты, есть также способ справиться с этим из кода (например, в случае элементов управления, которые по какой-либо причине создаются динамически и не существуют в 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(); } }
источник
Поэкспериментировав, решение xaml
FocusManager.FocusedElement="{Binding ElementName=yourElement}"
кажется, работает лучше всего, когда вы помещаете его в самый верхний элемент в иерархии окон (обычно Window или Grid, в которые вы помещаете все остальное)
источник
Применение:
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); }
источник
У меня есть TextBox внутри Grid внутри DataTemplate, которому я хочу, чтобы фокус клавиатуры был виден. Я также обнаружил, что
<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>
у меня не сработало.
Однако когда я вызываю Focus () в родительском ContentControl
private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if ((sender as ContentControl).IsVisible) { (sender as ContentControl).Focus(); } }
он начинает работать, и в текстовом поле отображается курсор. Я думаю, что FocusScope должен быть в фокусе, чтобы свойство FocusManager.FocusedElement имело какой-либо эффект.
Джерри
источник