Встановіть фокус на текстовому полі в xaml wpf


91

Незважаючи на деякі повідомлення на цьому форумі та інші, я не можу знайти щось, що підказує мені, як сфокусувати увагу на TextBox.

У мене є userControl з багатьма мітками та textBoxes. Коли форма завантажується, я хочу, щоб конкретний textBox мав фокус.

Я встановив tabIndex, але це, здається, не спрацювало.

Будь-які пропозиції?


Відповіді:


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: Це було досить просте управління, дві кнопки та TextBox у сітці (куди я клав FocusManagerречі). Зрештою, я зробив це в коді.
TarkaDaal

Член "FocusedElement" не розпізнаний або недоступний. :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Хенді Іраван

@HendyIrawan Це, можливо, проект Silverlight?
MojoFilter

@MojoFilter, це проект WPF для Windows Phone 8
Хенді Іраван

28

Ви можете застосувати цю властивість безпосередньо на TextBox:

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

16
У мене не вийшло, встановлення FocusManager.FocusedElement = "{Binding ElementName = TxtB}" на контейнері справді спрацювало
Надання

1
Працює як шарм і не вимагає ніяких імен.
Саймон Маттес,

1
Не працював і у мене. Ми чогось пропускаємо?
BrunoLM

1
Мені теж не вдалося. Пропозиція роботи Жульєна Лебосквена.
Crypt32

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 роки потому ...
Адам Плочер

4
@AdamPlocher Приємно, ви назавжди відключили Sulfian від Stack Overflow. Повідомлення "Ласкаво просимо до переповнення стека" було б більш доречним.
Контанго

2
@Contango: "Востаннє бачив Nov 11 '14". Його давно не було до того, як Адам опублікував свій коментар :)
Пропало кодування

0

FocusManager не був у сутичці, і це мене трохи збентежило. Я просто набрав весь атрибут, і він спрацював.

FocusManager.FocusedElement = "{Ім'я прив'язки = MyTextBox}"


Microsoft Visual Studio Enterprise 2015 версії 14.0.23107.0/C#/WPF


0

Для повноти є також спосіб обробити це із коду позаду (наприклад, у випадку елементів керування, які з якихось причин створюються динамічно і не існують у XAML). Приєднайте обробник до завантаженої події вікна, а потім використовуйте метод ".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

У мене є TextBox всередині сітки всередині 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();
    }
}

він починає працювати, і каретка видно в TextBox. Я думаю, що FocusScope повинен бути зосереджений, щоб властивість FocusManager.FocusedElement мала ефект.

Джеррі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.