Atur fokus pada kotak teks di xaml wpf

91

Meskipun ada beberapa posting di forum ini dan yang lainnya, saya tidak dapat menemukan sesuatu yang memberitahu saya bagaimana mengatur fokus pada TextBox.

Saya memiliki userControl dengan banyak label dan textBoxes. Saat formulir dimuat, saya ingin kotak teks tertentu memiliki fokus.

Saya telah mengatur tabIndex tetapi sepertinya tidak berhasil.

Ada saran?

pengguna9969
sumber
Kemungkinan duplikat dari WPF dan fokus awal
Ruben Bartelink

Jawaban:

177

Anda dapat menggunakan FocusManager.FocusedElementproperti terlampir untuk tujuan ini. Berikut adalah potongan kode yang mengatur fokus ke TxtB secara default.

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

Anda juga dapat menggunakan TxtB.Focus()di belakang kode Anda jika Anda tidak ingin melakukan ini di XAML.

Julien Lebosquain
sumber
13
@TarkaDaal: komentar "itu tidak berhasil untuk saya" bisa sedikit lebih rumit. Mungkin kontrol lain yang mencuri fokus. Ketika perang fokus dimulai di WPF, banyak hal cenderung menjadi nakal! Harap verifikasi kontrol Anda, dan posisi Anda saat ini di pohon visual (misalnya, di dalam template ComboBox, ini tidak akan berpengaruh, dan ada banyak kasus lain seperti ini). Jika Anda tidak dapat menemukan pencurinya, gunakan perilaku atau kode di belakang untuk mengatur fokus ke kontrol saat dimuat.
Julien Lebosquain
@JulienLebosquain: Itu adalah kontrol yang cukup sederhana, dua tombol dan TextBox di dalam Grid (di mana saya meletakkan FocusManagerbarang - barang itu). Pada akhirnya, saya melakukannya di belakang kode.
TarkaDaal
Anggota "FocusedElement" tidak dikenali atau tidak dapat diakses. :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Hendy Irawan
@HendyIrawan Apakah itu proyek Silverlight, mungkin?
MojoFilter
@MojoFilter ini adalah proyek WPF Windows Phone 8
Hendy Irawan
26

Anda dapat menerapkan properti ini langsung di TextBox:

<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
Max
sumber
17
Tidak berhasil untuk saya, menyetel FocusManager.FocusedElement = "{Binding ElementName = TxtB}" pada penampung berhasil
Berikan
1
Bekerja seperti pesona dan tidak memerlukan penamaan apa pun.
Simon Mattes
1
Tidak berhasil untuk saya juga. Apakah kita melewatkan sesuatu?
BrunoLM
1
Tidak berhasil untuk saya juga. Saran oleh karya Julien Lebosquain.
Crypt32
1
Juga tidak berhasil untuk saya. Semua metode lain yang diusulkan juga tidak berfungsi. Masalah ini harus mendasar dan harus diselesaikan dengan mudah .. Itu sebabnya banyak orang tidak suka wpf.
IgorStack
6

Saya baru menggunakan WPF dan membaca contoh-contoh di atas. Saya memiliki pengalaman serupa mencoba mengatur fokus ke kotak teks menggunakan contoh kode xaml yang diberikan, yaitu semua contoh di atas tidak berfungsi.

Apa yang saya temukan adalah saya harus menempatkan FocusManager.FocusElement di elemen halaman. Saya berasumsi ini mungkin akan bekerja dengan baik jika Anda menggunakan Window sebagai elemen induk. Bagaimanapun, ini adalah kode yang berhasil untuk saya.

 <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>
Joseph Mawer
sumber
0

ikat elemen yang ingin Anda arahkan sebagai fokus

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

di grid atau groupbox dll

Sufian Bashir
sumber
4
Uhh ya, terima kasih telah memberikan jawaban yang sama yang dilakukan orang lain ... 4 tahun kemudian ...
Adam Plocher
4
@AdamPlocher Bagus, kamu mematikan Sulfian dari Stack Overflow secara permanen. Pesan "Selamat datang di Stack overflow" akan lebih sesuai.
Contango
2
@Contango: "Terakhir dilihat Nov 11 '14". Dia sudah lama pergi sebelum Adam memposting komentarnya :)
Gone Coding
0

FocusManager tidak masuk akal dan ini sedikit membingungkan saya. Saya baru saja mengetik seluruh atribut dan berhasil.

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


Microsoft Visual Studio Enterprise 2015 versi 14.0.23107.0/C#/WPF

icernos.dll
sumber
0

Untuk kelengkapan, ada juga cara untuk menangani ini dari kode belakang (misalnya dalam kasus kontrol yang, untuk alasan apa pun, dibuat secara dinamis dan tidak ada di XAML). Lampirkan handler ke event Loaded jendela dan kemudian gunakan metode ".Focus ()" dari kontrol yang Anda inginkan. Contoh tulang telanjang di bawah ini.

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();
    }
}
Robert N
sumber
0

Dari bereksperimen berkeliling, solusi xaml

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

tampaknya berfungsi paling baik saat Anda menempatkannya di elemen tertinggi dalam hierarki jendela (biasanya Jendela, atau Kotak tempat Anda meletakkan semua yang lain)

Tan Jing Yuan
sumber
0

Pemakaian: 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);
    }
SERKAN
sumber
0

Saya memiliki TextBox di dalam Grid di dalam DataTemplate yang ingin saya fokuskan keyboard saat terlihat. Saya juga menemukan itu

<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>

tidak bekerja untuk saya.

Namun ketika saya memanggil Focus () di induk ContentControl

private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((sender as ContentControl).IsVisible)
    {
        (sender as ContentControl).Focus();
    }
}

itu mulai bekerja dan tanda sisipan terlihat di TextBox. Saya pikir FocusScope harus diberi fokus agar properti FocusManager.FocusedElement memiliki efek.

Jerry

Jerry
sumber