Jika saya menelepon SelectAll
dari GotFocus
pengendali acara, itu tidak berfungsi dengan mouse - pilihan menghilang segera setelah mouse dilepaskan.
EDIT: Orang-orang menyukai jawaban Donnelle, saya akan mencoba menjelaskan mengapa saya tidak menyukainya sebanyak jawaban yang diterima.
- Itu lebih kompleks, sementara jawaban yang diterima melakukan hal yang sama dengan cara yang lebih sederhana.
- Kegunaan jawaban yang diterima lebih baik. Ketika Anda mengklik di tengah teks, teks menjadi tidak dipilih ketika Anda melepaskan mouse yang memungkinkan Anda untuk mulai mengedit secara instan, dan jika Anda masih ingin memilih semua, cukup tekan tombol lagi dan kali ini tidak akan membatalkan pilihan pada rilis. Mengikuti resep Donelle, jika saya mengklik di tengah teks, saya harus mengklik kedua kalinya untuk dapat mengedit. Jika saya mengklik di suatu tempat di dalam teks versus di luar teks, ini kemungkinan besar berarti saya ingin mulai mengedit alih-alih menimpa segalanya.
.net
wpf
silverlight
textbox
Sergey Aldoukhov
sumber
sumber
Jawaban:
Tidak tahu mengapa itu kehilangan pilihan dalam
GotFocus
acara tersebut.Tapi salah satu solusinya adalah dengan melakukan seleksi pada
GotKeyboardFocus
danGotMouseCapture
acara. Dengan begitu itu akan selalu berhasil.sumber
Kami memilikinya sehingga klik pertama memilih semua, dan klik lain menuju kursor (aplikasi kami dirancang untuk digunakan pada tablet dengan pena).
Anda mungkin menemukan itu berguna.
sumber
SelectAllText
metodetextBox.IsFocused
memperbaikinya. Anda tidak ingin memilih semua ketikaGetKeyboardFocus
itu karena alt-tab ke dalam program.Jawaban Donnelle bekerja dengan baik, tetapi harus mendapatkan kelas baru untuk menggunakannya adalah menyakitkan.
Alih-alih melakukan itu, saya mendaftarkan handler handler di App.xaml.cs untuk semua TextBox dalam aplikasi. Ini memungkinkan saya untuk menggunakan jawaban Donnelle dengan kontrol TextBox standar.
Tambahkan metode berikut ke App.xaml.cs Anda:
sumber
Ini agak lama, tetapi saya tetap akan menampilkan jawaban saya.
Saya telah memilih sebagian dari jawaban Donnelle (melewatkan klik dua kali) karena saya pikir ini lebih alami. Namun, seperti gcores saya tidak suka kebutuhan untuk membuat kelas turunan. Tapi saya juga tidak suka gcores
OnStartup
metode . Dan saya membutuhkan ini atas dasar "umumnya tetapi tidak selalu".Saya telah mengimplementasikan ini sebagai lampiran
DependencyProperty
sehingga saya dapat mengaturlocal:SelectTextOnFocus.Active = "True"
xaml. Saya menemukan cara ini yang paling menyenangkan.Untuk fitur "umum tapi tidak selalu", saya mengatur Atribut Properti ini
True
menjadi (global)TextBox
Style
. Dengan cara ini "memilih Teks" selalu "aktif", tetapi saya dapat menonaktifkannya berdasarkan per-kotak teks.sumber
Berikut adalah perilaku Blend yang menerapkan solusi jawaban untuk kenyamanan Anda:
Satu untuk melampirkan ke TextBox tunggal:
Dan satu untuk melampirkan ke akar wadah yang berisi beberapa TextBox'es:
sumber
Meskipun ini adalah pertanyaan lama, saya baru saja mengalami masalah ini tetapi menyelesaikannya menggunakan Perilaku Terlampir, bukan Perilaku Ekspresi seperti dalam jawaban Sergey. Ini berarti saya tidak memerlukan dependensi di
System.Windows.Interactivity
dalam Blend SDK:Anda kemudian dapat menggunakannya di XAML Anda seperti ini:
Saya menulis blog di sini .
sumber
Berikut ini adalah solusi sangat sederhana yang sangat bagus di MSDN :
Berikut kode di belakang:
sumber
Saya pikir ini bekerja dengan baik:
Jika Anda ingin menerapkannya sebagai metode ekstensi:
Dan di
GotFocus
acara Anda :Saya menemukan solusi di atas karena beberapa bulan yang lalu saya mencari cara untuk menetapkan fokus ke yang diberikan
UIElement
. Saya menemukan kode di bawah ini di suatu tempat (kredit diberikan dengan ini) dan berfungsi dengan baik. Saya mempostingnya meskipun itu tidak secara langsung terkait dengan pertanyaan OP karena itu menunjukkan pola penggunaan yang samaDispatcher
untuk bekerja dengan aUIElement
.sumber
Berikut ini adalah upaya untuk memecahkan beberapa masalah dengan solusi lain:
Kode yang saya tulis dapat dikonfigurasi. Anda dapat memilih apa tindakan pilih semua perilaku harus terjadi dengan menetapkan tiga bidang dibaca:
SelectOnKeybourdFocus
,SelectOnMouseLeftClick
,SelectOnMouseRightClick
.Kelemahan dari solusi ini adalah lebih rumit dan keadaan statis disimpan. Sepertinya perjuangan buruk dengan perilaku default dari
TextBox
kontrol. Namun, ia berfungsi dan semua kode disembunyikan di kelas kontainer Properti Terlampir.Untuk memasang Properti Terlampir ke a
TextBox
, semua yang perlu Anda lakukan adalah menambahkan namespace xml (xmlns
) dari Properti Terlampir dan kemudian menggunakannya seperti ini:Beberapa catatan tentang solusi ini:
TextBox
mengingat seleksi setelah kehilangan fokus. Saya sebenarnya telah menimpa perilaku ini.TextBox
(FirstActionIsMouseDown
bidang statis).ContextMenu
bidang statis).Satu-satunya efek samping yang saya temukan adalah kapan
SelectOnMouseRightClick
benar. Kadang-kadang menu konteks klik kanan berkedip ketika itu dibuka dan mengklik kanan pada kosong diTextBox
tidak melakukan "pilih semua".sumber
Saya menemukan tidak ada jawaban yang disajikan di sini meniru kotak teks Windows standar. Misalnya, coba klik di ruang putih antara karakter terakhir dari kotak teks dan sisi kanan kotak teks. Sebagian besar solusi di sini akan selalu memilih seluruh konten, yang membuatnya sangat sulit untuk menambahkan teks ke kotak teks.
Jawaban yang saya sajikan di sini berperilaku lebih baik dalam hal ini. Ini adalah perilaku (sehingga membutuhkan perakitan System.Windows.Interactivity dari Blend SDK ). Itu bisa ditulis ulang menggunakan properti terlampir juga.
Ini berdasarkan kode yang saya temukan di sini .
sumber
Implementasi sederhana ini berfungsi dengan baik untuk saya:
Untuk menerapkannya ke semua
TextBox
, masukkan kode berikut setelahInitializeComponent();
sumber
Dalam file App.xaml:
Dalam file App.xaml.cs:
Dengan kode ini Anda menjangkau semua
TextBox
dalam aplikasi Anda.sumber
Diambil dari sini :
Daftarkan event handler global dalam file App.xaml.cs:
Kemudian pawang sederhana:
sumber
Saya menyadari ini sangat tua, tetapi di sini adalah solusi saya yang didasarkan pada ekspresi / microsoft interaktivitas dan ruang nama interaksi.
Pertama, saya mengikuti instruksi di tautan ini untuk menempatkan pemicu interaktivitas ke dalam gaya.
Lalu turun ke ini
dan ini
Dalam kasus saya, saya memiliki kontrol pengguna di mana kotak teks yang memiliki kode di belakang. Kode-belakang memiliki fungsi handler. Saya memberi nama kontrol pada pengguna saya di XAML, dan saya menggunakan nama itu untuk elemen. Ini bekerja dengan baik untuk saya. Cukup terapkan gaya ke
TextBox
mana pun Anda ingin memiliki semua teks yang dipilih ketika Anda mengklik diTextBox
.Yang pertama
CallMethodAction
memanggil metode kotak teksSelectAll
ketikaGotKeyboardFocus
acaraTextBox
menyala.Saya harap ini membantu.
sumber
Saya telah menggunakan jawaban Nils tetapi dikonversi menjadi lebih fleksibel.
Di XAML, Anda dapat menggunakan seperti ini:
sumber
Ini adalah versi C # dari jawaban yang diposting oleh @Nasenbaer
sedangkan
MyTextBox_GotFocus
event handler ditugaskan untukGotFocus
acaraMyTextBox
.sumber
Saya punya jawaban yang sedikit disederhanakan untuk ini (hanya
PreviewMouseLeftButtonDown
acara) yang sepertinya meniru fungsi browser yang biasa:Di XAML Anda memiliki
TextBox
suara:Dalam codebehind:
sumber
Coba metode ekstensi ini untuk menambahkan perilaku yang diinginkan ke kontrol TextBox apa pun. Saya belum mengujinya secara ekstensif, tetapi tampaknya memenuhi kebutuhan saya.
sumber
Saya mencari banyak solusinya, saya menemukan beberapa solusi untuk memilih semua. Namun, masalahnya adalah ketika kita melakukan klik kanan dan memotong / menyalin setelah memilih bagian teks dari kotak teks, ia memilih semua bahkan saya memilih bagian teks. Untuk memperbaikinya di sini adalah solusinya. Cukup tambahkan kode di bawah ini di acara pilih keyboard. Ini berhasil untuk saya.
sumber
Saya memiliki masalah yang sama. Di VB.Net cara kerjanya mudah:
VB XAML:
Kode belakang:
C # (terima kasih kepada ViRuSTriNiTy)
sumber
Sejauh ini, ini adalah solusi paling sederhana.
Tambahkan global handler ke aplikasi (App.xaml.cs) dan selesai. Anda hanya perlu beberapa baris kode.
Jadi gunakan kelas EventManager untuk mendaftarkan pengendali event global terhadap suatu tipe (TextBox). Pawang yang sebenarnya mati sederhana:
Periksa di sini: WPF TextBox SelectAll on Focus
Semoga ini bisa membantu.
sumber
Bagi mereka yang tertarik dengan pendekatan Donnelle / Groky, tetapi ingin klik di sebelah kanan karakter terakhir (tetapi masih di dalam
TextBox
) untuk menempatkan tanda sisipan di akhir teks yang dimasukkan, saya telah datang dengan solusi ini:The
GetRoundedCharacterIndexFromPoint
Metode diambil dari ini posting.sumber
Setelah googling dan pengujian, saya menemukan solusi sederhana yang bekerja untuk saya.
Anda perlu menambahkan pengendali acara ke
Loaded
acara jendela kontainer Anda:Selanjutnya, Anda harus membuat handler ke kode referensi
RoutedEventHandler
sebelumnya:Sekarang, Anda dapat menambahkan
SelectAll()
perintah padaGotFocus
pengendali acara keTextBox
kontrol apa pun secara terpisah:Teks Anda sekarang dipilih pada fokus!
Diadaptasi dari solusi Dr. WPF, Forum MSDN
sumber
sumber
Ini sepertinya bekerja dengan baik untuk saya. Ini pada dasarnya adalah rekap dari beberapa posting sebelumnya. Saya hanya memasukkan ini ke file MainWindow.xaml.cs saya di konstruktor. Saya membuat dua penangan, satu untuk keyboard, dan satu untuk mouse, dan menyalurkan kedua acara ke fungsi yang sama
HandleGotFocusEvent
,, yang didefinisikan tepat setelah konstruktor dalam file yang sama.sumber
Cara mudah untuk mengganti mouseDown dan memilih semua setelah klik dua kali adalah:
sumber
Coba letakkan ini di konstruktor kontrol apa pun yang menampung kotak teks Anda:
sumber
Jika ada acara yang tidak memilih teks selama
OnFocus
mouse di atas, saya biasanya hanya menunda pilih semua.sumber
Saya sudah menguji semuanya tetapi hanya yang berikut ini yang berhasil:
sumber
GetType().Name
alih-alihis
atauas
cukupSaya melihat bahwa ada banyak jawaban, tetapi sebagai yang disetujui, metode yang harus digunakan adalah
EditTextBoxGotCapture
dengan kode berikut di belakang:
sumber