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?


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.


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}}"/>

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>

0

ikat elemen yang ingin Anda arahkan sebagai fokus

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

di grid atau groupbox dll


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


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();
    }
}

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)


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);
    }

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.