Tampaknya ketika aplikasi WPF dimulai, tidak ada yang memiliki fokus.
Ini sangat aneh. Setiap kerangka kerja lain yang saya gunakan melakukan apa yang Anda harapkan: menempatkan fokus awal pada kontrol pertama dalam urutan tab. Tetapi saya telah mengkonfirmasi bahwa itu adalah WPF, bukan hanya aplikasi saya - jika saya membuat Window baru, dan hanya memasukkan TextBox di dalamnya, dan menjalankan aplikasi, TextBox tidak memiliki fokus sampai saya mengkliknya atau tekan Tab . Yuck.
Aplikasi saya yang sebenarnya lebih rumit dari sekedar TextBox. Saya memiliki beberapa lapisan UserControls dalam UserControls. Salah satu UserControls memiliki penangan Focusable = "True" dan KeyDown / KeyUp, dan saya ingin itu memiliki fokus segera setelah jendela saya terbuka. Saya masih agak pemula WPF, dan saya tidak punya banyak keberuntungan mencari tahu bagaimana melakukan ini.
Jika saya memulai aplikasi saya dan menekan tombol Tab, maka fokus beralih ke kontrol yang dapat saya fokuskan, dan mulai berfungsi seperti yang saya inginkan. Tapi saya tidak ingin pengguna saya harus menekan Tab sebelum mereka dapat mulai menggunakan jendela.
Saya telah bermain-main dengan FocusManager.FocusedElement, tapi saya tidak yakin kontrol mana yang digunakan (Window tingkat atas? Induk yang berisi kontrol yang dapat difokus? Kontrol yang dapat difokus sendiri?) Atau untuk mengaturnya.
Apa yang harus saya lakukan untuk mendapatkan kontrol mendalam saya untuk memiliki fokus awal segera setelah jendela terbuka? Atau lebih baik lagi, untuk memfokuskan kontrol fokus pertama dalam urutan tab?
Saya memiliki ide cemerlang untuk menggali melalui Reflector untuk melihat di mana properti Focusable digunakan, dan menemukan jalan saya ke solusi ini. Saya hanya perlu menambahkan kode berikut ke konstruktor Window saya:
Ini akan secara otomatis memilih kontrol pertama dalam urutan tab, jadi ini adalah solusi umum yang harus dapat dimasukkan ke jendela mana saja dan Just Work.
sumber
Button
. Untuk memperbaikinya, saya membalikMoveFocus
panggilan melalui operator diContextIdle
prioritas (Background
atau lebih tinggi tidak berfungsi). Juga, adaFocusNavigationDirection.First
yang cocok dengan maksud lebih baik dan melakukan hal yang sama dalam kasus ini.Berdasarkan jawaban yang diterima diterapkan sebagai perilaku terlampir:
Gunakan seperti ini:
sumber
DependencyProperty.RegisterAttached
. Parameter ketiga seharusnyatypeof(FocusBehavior)
, bukantypeof(Control)
. Membuat perubahan ini akan mencegah desainer melaporkan properti 'FocusFirst' yang sudah terdaftar oleh kesalahan 'Kontrol'.Saya menemukan solusi lain yang mungkin. Mark Smith memposting ekstensi markup FirstFocusedElement untuk digunakan dengan FocusManager.FocusedElement.
sumber
Apakah masalah yang sama diselesaikan dengan solusi sederhana: Di jendela utama:
Di kontrol pengguna:
sumber
Setelah memiliki 'WPF Initial Focus Nightmare' dan berdasarkan pada beberapa jawaban di stack, berikut ini terbukti bagi saya untuk menjadi solusi terbaik.
Pertama, tambahkan App.xaml OnStartup () berikut ini:
Kemudian tambahkan acara 'WindowLoaded' juga di App.xaml:
Masalah threading harus digunakan karena fokus awal WPF sebagian besar gagal karena beberapa kondisi ras kerangka.
Saya menemukan solusi berikut yang terbaik karena digunakan secara global untuk seluruh aplikasi.
Semoga ini bisa membantu ...
Oran
sumber
BeginInvoke
bukannyaSleep(100)
pernyataan menakutkan itu .Anda dapat dengan mudah mengatur kontrol itu sendiri sebagai elemen fokus di XAML.
Saya tidak pernah mencoba mengatur ini dalam kontrol pengguna dan melihat apakah ini berfungsi, tetapi mungkin.
sumber
Versi minimal dari jawaban Mizipzor untuk C # 6+.
Gunakan di XAML Anda:
sumber
Jika Anda seperti saya, dan Anda menggunakan beberapa kerangka kerja yang, entah bagaimana, mengacaukan perilaku fokus dasar, dan membuat semua solusi di atas tidak relevan, Anda masih dapat melakukan ini:
1 - Catat elemen yang mendapatkan fokus (apa pun itu!)
2 - Tambahkan ini dalam kode Anda di belakang xxx.xaml.cs
3 - Tambahkan ini pada elemen yang mendapatkan fokus pertama:
4 - Tambahkan metode Element_GotFocus dalam kode di belakang, dan tentukan elemen bernama WPF yang membutuhkan fokus pertama:
5 - Kelola acara yang Dimuat
dalam XAML
dalam xaml.cs
Semoga ini akan membantu sebagai solusi resor terakhir
sumber
Saya juga menghadapi masalah yang sama. Saya memiliki tiga kotak teks di dalam wadah kanvas dan ingin kotak teks pertama difokuskan ketika kontrol pengguna terbuka. Kode WPF mengikuti pola MVVM. Saya membuat kelas perilaku terpisah untuk memfokuskan elemen dan mengikatnya dengan pandangan saya seperti ini.
Kode perilaku kanvas
Kode untuk dilihat
sumber
Solusi di atas tidak berfungsi seperti yang diharapkan untuk saya, saya telah sedikit mengubah perilaku yang diusulkan oleh Mizipzor sebagai berikut:
Dari bagian ini
Untuk ini
Dan saya tidak melampirkan perilaku ini ke Window atau UserControl, tetapi untuk mengontrol saya ingin fokus pada awalnya, misalnya:
Oh, maaf untuk penamaan yang berbeda, saya menggunakan nama InitialFocus untuk properti terlampir.
Dan ini bekerja untuk saya, mungkin bisa membantu orang lain.
sumber
sumber