Saya ingin menerima angka dan titik desimal, tetapi tidak ada tanda.
Saya telah melihat sampel menggunakan kontrol NumericUpDown untuk Windows Forms, dan sampel kontrol kustom NumericUpDown ini dari Microsoft . Tapi sejauh ini sepertinya NumericUpDown (didukung oleh WPF atau tidak) tidak akan menyediakan fungsionalitas yang saya inginkan. Cara aplikasi saya dirancang, tidak ada orang waras yang mau mengacaukan panah. Mereka tidak masuk akal secara praktis, dalam konteks aplikasi saya.
Jadi saya sedang mencari cara sederhana untuk membuat WPF TextBox standar hanya menerima karakter yang saya inginkan. Apakah ini mungkin? Apakah ini praktis?
double.TryParse()
mungkin akan diimplementasikan dengan jumlah baris yang sama dan lebih fleksibel.Pengatur kejadian sedang mempratinjau input teks. Di sini ekspresi reguler hanya cocok dengan input teks jika bukan angka, dan kemudian tidak dibuat untuk masuk ke kotak teks.
Jika Anda hanya menginginkan huruf, maka ganti ekspresi reguler dengan
[^a-zA-Z]
.XAML
FILE XAML.CS
sumber
Saya menggunakan beberapa dari apa yang sudah ada di sini dan menempatkan twist saya sendiri di atasnya menggunakan perilaku jadi saya tidak perlu menyebarkan kode ini sepanjang satu ton Tampilan ...
Berikut ini adalah kode tampilan yang relevan:
sumber
Ini adalah solusi yang lebih baik dari jawaban WilP . Peningkatan saya adalah:
EmptyValue
properti, jika string kosong tidak pantasPenggunaannya cukup mudah:
sumber
MaxLength
Anda(this.MaxLength == 0 || text.Length <= this.MaxLength)
kembali selalufalse
ketika menguji teks baru. Ini seharusnya lebih baik(this.MaxLength == int.MinValue || text.Length <= this.MaxLength)
karena Anda menetapkanint.MinValue
sebagai nilai default untukMaxLength
.UpdateSourceTrigger=PropertyChanged
mengikat. Tahu cara membuat kode ini berfungsi saat mengubahUpdateSourceTrigger
diatur kePropertyChanged
? Terima kasih telah membagikan kode ini.Ini adalah cara yang sangat sederhana dan mudah untuk melakukan ini menggunakan MVVM.
Bind TextBox Anda dengan properti integer dalam model tampilan, dan ini akan bekerja seperti permata ... bahkan akan menunjukkan validasi ketika non-integer dimasukkan dalam kotak teks.
Kode XAML:
Lihat kode model:
sumber
long
kefloat
, tapi itu tidak bekerja dengan benar dengan validasi langsung. Saya menambahkanUpdateSourceTrigger="PropertyChanged"
ke ikatan, sehingga akan melakukan validasi karena setiap karakter diketik, dan tidak bisa lagi mengetikkan '.' di TextBox kecuali ada karakter ilegal hadir (harus mengetik "1x.234" lalu hapus 'x'). Rasanya juga agak lamban dalam mode ini. Ini tampaknya digunakanSystem.Number.ParseSingle()
untuk melakukan pekerjaan, sehingga menerima berbagai notasi.Tambahkan ATURAN VALIDASI sehingga ketika teks berubah, periksa untuk menentukan apakah data itu numerik, dan jika ya, izinkan pemrosesan dilanjutkan, dan jika tidak, minta pengguna bahwa hanya data numerik yang diterima di bidang itu.
Baca selengkapnya di Validasi di Windows Presentation Foundation
sumber
double
dan itu sudah memberi Anda validasi standar.Toolkit WPF yang Diperluas memiliki satu: NumericUpDown
sumber
NumericUpDown
sekarang sudah usang. Anda dapat menggunakanDecimalUpDown
dari toolkit yang diperbarui Extended WPF Toolkit ™ Community EditionBisa juga cukup menerapkan aturan validasi dan menerapkannya ke TextBox:
Dengan implementasi aturan sebagai berikut (menggunakan Regex yang sama seperti yang diusulkan dalam jawaban lain):
sumber
Di sini saya punya solusi sederhana yang terinspirasi oleh jawaban Ray . Ini harus cukup untuk mengidentifikasi segala bentuk angka.
Solusi ini juga dapat dengan mudah dimodifikasi jika Anda hanya menginginkan angka positif, nilai integer atau nilai yang akurat untuk jumlah maksimum tempat desimal, dll.
Seperti yang disarankan dalam jawaban Ray , Anda harus terlebih dahulu menambahkan
PreviewTextInput
acara:Kemudian letakkan yang berikut ini dalam kode di belakang:
sumber
Saya mengizinkan nomor keypad numerik dan backspace:
sumber
var keyEnum = (System.Windows.Input.Key) e.Key; e.Handled = !(keyEnum >= System.Windows.Input.Key.D0 && keyEnum <= System.Windows.Input.Key.D9 || keyEnum >= System.Windows.Input.Key.NumPad0 && keyEnum <= System.Windows.Input.Key.NumPad9 || keyEnum == System.Windows.Input.Key.Back);
Saya akan berasumsi bahwa:
TextBox Anda yang ingin Anda izinkan input numerik hanya memiliki properti Text-nya yang awalnya disetel ke beberapa nilai angka yang valid (misalnya, 2.7172).
Textbox Anda adalah anak dari jendela utama Anda
Jendela utama Anda adalah kelas Window1
Nama TextBox Anda adalah numericTB
Ide dasar:
Tambahkan:
private string previousText;
ke kelas jendela utama Anda (Window1)Tambahkan:
previousText = numericTB.Text;
ke konstruktor jendela utama AndaBuat penangan untuk numericTB.TextChanged event menjadi sesuatu seperti ini:
Ini akan terus menetapkan Teks sebelumnya ke numericTB. Teks selama itu valid, dan mengatur numericTB. Teks ke nilai valid terakhir jika pengguna menulis sesuatu yang tidak Anda sukai. Tentu saja, ini hanya ide dasar, dan itu hanya "tahan idiot", bukan "bukti idiot". Itu tidak menangani kasus di mana pengguna mengacaukan ruang, misalnya. Jadi di sini adalah solusi lengkap yang saya pikir adalah "bukti idiot", dan jika saya salah tolong beri tahu saya:
Konten file Window1.xaml Anda:
Konten file Window.xaml.cs Anda:
Dan itu saja. Jika Anda memiliki banyak TextBox maka saya sarankan untuk membuat CustomControl yang mewarisi dari TextBox, sehingga Anda dapat membungkus sebelumnyaTeks dan numericTB_TextDirubah dalam file terpisah.
sumber
Ini adalah satu-satunya kode yang diperlukan:
Ini hanya memungkinkan angka untuk dimasukkan ke dalam kotak teks.
Untuk mengizinkan titik desimal atau tanda minus, Anda dapat mengubah ekspresi reguler menjadi
[^0-9.-]+
.sumber
Jika Anda tidak ingin menulis banyak kode untuk melakukan fungsi dasar (saya tidak tahu mengapa orang membuat metode panjang) Anda bisa melakukan ini:
Tambahkan namespace:
Di XAML, setel properti TextChanged:
Di WPF di bawah metode txt1_TextChanged, tambahkan
Regex.Replace
:sumber
Pendekatan lain akan menggunakan perilaku terlampir, saya menerapkan TextBoxHelper kustom saya kelas , yang dapat digunakan pada kotak teks di seluruh proyek saya. Karena saya pikir bahwa berlangganan acara untuk setiap kotak teks dan di setiap file XAML individu untuk tujuan ini dapat memakan waktu.
Kelas TextBoxHelper yang saya implementasikan memiliki fitur-fitur ini:
Berikut ini adalah implementasi kelas TextBoxHelper:
Dan inilah beberapa contoh penggunaannya yang mudah:
Atau
Perhatikan bahwa TextBoxHelper saya berada di viewHelpers xmlns alias.
Saya harap implementasi ini memudahkan pekerjaan orang lain :)
sumber
di acara keydown preview kotak teks.
sumber
sumber
.
, karenae.Text
hanya mengembalikan karakter input terakhir dan sebuah titik akan gagal dalamIsDigit
pemeriksaan.Bagi mereka yang mencari implementasi cepat dan sangat sederhana untuk jenis masalah ini hanya menggunakan bilangan bulat dan desimal, dalam file XAML Anda, tambahkan
PreviewTextInput
properti ke AndaTextBox
dan kemudian dalam file xaml.cs Anda gunakan:Ini agak berlebihan untuk terus memeriksa seluruh string setiap kali kecuali, seperti yang orang lain katakan, Anda melakukan sesuatu dengan notasi ilmiah (meskipun, jika Anda menambahkan karakter tertentu seperti 'e', regex sederhana yang menambahkan simbol / karakter adalah sangat sederhana dan diilustrasikan dalam jawaban lain). Tetapi untuk nilai floating point sederhana, solusi ini sudah cukup.
Ditulis sebagai one-liner dengan ekspresi lambda:
sumber
Kita dapat melakukan validasi pada event yang diubah kotak teks. Implementasi berikut ini mencegah input penekanan tombol selain dari angka dan satu angka desimal.
sumber
Bagaimana dengan ini? Bekerja dengan baik untuk saya. Berharap saya tidak melewatkan kasus tepi ...
sumber
Dalam Formulir Windows itu mudah; Anda dapat menambahkan acara untuk KeyPress dan semuanya bekerja dengan mudah. Namun, di WPF acara itu tidak ada. Tetapi ada cara yang lebih mudah untuk itu.
WPF TextBox memiliki acara TextChanged yang umum untuk semuanya. Itu termasuk menempel, mengetik, dan apa pun yang bisa muncul di pikiran Anda.
Jadi Anda dapat melakukan sesuatu seperti ini:
XAML:
KODE DI BALIK:
Ini juga menerima
.
, jika Anda tidak menginginkannya, hapus saja dariregex
pernyataan yang ada@[^\d]
.Catatan : Acara ini dapat digunakan pada banyak TextBox'es karena menggunakan
sender
Teks objek. Anda hanya menulis acara sekali dan dapat menggunakannya untuk beberapa TextBox'es.sumber
Sekarang saya tahu pertanyaan ini memiliki jawaban yang diterima , tetapi secara pribadi, saya merasa sedikit membingungkan dan saya percaya seharusnya lebih mudah dari itu. Jadi saya akan mencoba menunjukkan bagaimana saya membuatnya bekerja sebaik mungkin:
Di Windows Forms , ada acara yang disebut
KeyPress
yang sangat baik untuk tugas semacam ini. Tapi itu tidak ada di WPF , jadi sebagai gantinya, kami akan menggunakanPreviewTextInput
acara tersebut. Juga, untuk validasi, saya percaya seseorang dapat menggunakan aforeach
untuk mengulangitextbox.Text
dan mengecek apakah cocok ;) kondisinya, tapi jujur, ini adalah ekspresi reguler digunakan untuk .Satu hal lagi sebelum kita menyelami kode suci . Agar acara dipecat, seseorang dapat melakukan dua hal:
<PreviewTextInput="textBox_PreviewTextInput/>
Loaded
terjadi form (di mana textBox berada):textBox.PreviewTextInput += onlyNumeric;
Saya pikir metode kedua lebih baik karena dalam situasi seperti ini, sebagian besar Anda akan diminta untuk menerapkan kondisi yang sama (
regex
) ke lebih dari satuTextBox
dan Anda tidak ingin mengulangi sendiri!.Akhirnya, inilah cara Anda melakukannya:
sumber
Ini versi saya. Ini didasarkan pada
ValidatingTextBox
kelas dasar yang hanya membatalkan apa yang telah dilakukan jika tidak "valid". Ini mendukung tempel, potong, hapus, backspace, +, - dll.Untuk integer 32-bit, ada kelas Int32TextBox yang hanya membandingkan dengan int. Saya juga menambahkan kelas validasi floating point.
Catatan 1: Saat menggunakan pengikatan WPF, Anda harus memastikan bahwa Anda menggunakan kelas yang cocok dengan tipe properti terikat, jika tidak, ini dapat menyebabkan hasil yang aneh.
Catatan 2: Saat menggunakan kelas floating point dengan pengikatan WPF, pastikan pengikatan menggunakan budaya saat ini untuk mencocokkan metode TryParse yang saya gunakan.
sumber
Berikut ini adalah perpustakaan untuk input numerik dalam WPF
Ia memiliki properti seperti
NumberStyles
danRegexPattern
untuk validasi.Subkelas WPF
TextBox
sumber
Menggunakan:
sumber
Saya bekerja dengan kotak tidak terikat untuk proyek sederhana yang sedang saya kerjakan, jadi saya tidak bisa menggunakan pendekatan penjilidan standar. Karenanya saya membuat peretasan sederhana yang mungkin cukup berguna bagi orang lain dengan hanya memperluas kontrol TextBox yang ada:
Tentunya, untuk tipe mengambang, Anda ingin menguraikannya sebagai pelampung dan sebagainya. Prinsip yang sama berlaku.
Kemudian dalam file XAML Anda perlu memasukkan namespace yang relevan:
Setelah itu Anda dapat menggunakannya sebagai kontrol biasa:
sumber
Setelah menggunakan beberapa solusi di sini untuk beberapa waktu, saya mengembangkan sendiri yang berfungsi dengan baik untuk pengaturan MVVM saya. Perhatikan bahwa ini tidak sedinamis beberapa yang lain dalam arti masih memungkinkan pengguna untuk memasukkan karakter yang salah, tetapi menghalangi mereka dari menekan tombol dan dengan demikian melakukan apa saja. Ini berjalan dengan baik dengan tema saya tombol abu-abu ketika tindakan tidak dapat dilakukan.
Saya memiliki seorang
TextBox
pengguna yang harus memasukkan sejumlah halaman dokumen yang akan dicetak:... dengan properti yang mengikat ini:
Saya juga punya tombol:
... dengan perintah ini mengikat:
Dan kemudian ada metode
SetNumberOfPages()
, tetapi tidak penting untuk topik ini. Ini berfungsi dengan baik dalam kasus saya karena saya tidak perlu menambahkan kode apa pun ke dalam file di belakang kode Tampilan dan memungkinkan saya untuk mengontrol perilaku menggunakanCommand
properti.sumber
Saat memeriksa nilai angka Anda dapat menggunakan fungsi VisualBasic.IsNumeric .
sumber
Di aplikasi WPF, Anda dapat menangani ini dengan menangani
TextChanged
acara:sumber
Untuk pengembang yang ingin bidang teksnya hanya menerima nomor yang tidak ditandai seperti port soket dan sebagainya:
WPF
C #
sumber
65535
. Jika lebih besar maka itu bukan port yang valid. Juga, mengaturTextBox.MaxLength
untuk5
akan membantu baik secara program atau XAML .Inilah yang akan saya gunakan untuk mendapatkan kotak teks WPF yang menerima angka dan titik desimal:
Masukkan kode ke file kelas baru, tambahkan
di bagian atas file dan bangun solusinya. Kontrol numericTextBox kemudian akan muncul di bagian atas kotak alat.
sumber