WPF рдмрд╛рдЬрд╛рд░ рдкрд░ рдПрдХ рдирдИ рддрдХрдиреАрдХ рд╕реЗ рджреВрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛ рд╣реИред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдкрд╣рд┐рдпреЛрдВ рдФрд░ рдорд┐рд╢реНрд░ рдзрд╛рддреБ рдкрд╣рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреА рдЗрдЪреНрдЫрд╛ / рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдРрд╕рд╛ рд╣реА рдПрдХ рдХрд╛рд░реНрдп рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рдПрдВ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рддрд╛рд░реАрдЦ рдФрд░ рддреАрд╕рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реЛрдВред рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрдВрддрд┐рдо рдорд╛рдиреНрдпрддрд╛ рдЕрднреА рднреА рджреГрд╢реНрдп рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЗрдирдкреБрдЯ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдо рдореЗрдВ, рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рдлреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЬрдм рджреЗрд╡рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реЗ рдПрдХ рд╣реА рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдерд╛, рддреЛ рд╕рдм рдХреБрдЫ рдЖрдо рддреМрд░ рдкрд░ рд╕рд░рд▓ рдерд╛ред WPF рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЙрдмрд╛рд▓рддреЗ рд╣реИрдВ:
рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рд╡рд░реНрдЧ рдХреЗ рд╡рд╛рд░рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде
рд╕рдВрд▓рдЧреНрди рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдирд╛ред
рдиреЛрдЯ
рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рддрд░реНрдХ рдореЗрдВ рдмрд╣реБрдд рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рддрддреНрдХрд╛рд▓ рдХреЛрдб рдирдореВрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдпрд╛ рддреЛ GitHub рд╕реЗ рд╕рдВрдкреВрд░реНрдг WpfEx рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдпрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ TextBoxBehavior.cs рдФрд░ TextBoxDoubleValidator.cs рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ редрдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ?
рдЪреВрдВрдХрд┐ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдПрдХ рд╕рдЦреНрдд рд╕рдЦреНрдд рдкреНрд░рддрд┐рдмрдВрдз рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрдВрддреНрд░ рдЖрдкрдХреЛ рдЗрди рдЧреБрдгреЛрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рд╕рдВрд▓рдЧреНрди рд╕рдВрдкрддреНрддрд┐
рдбрдмрд▓-рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛред рдЬреЛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рднрд┐рдиреНрдирд╛рддреНрдордХ рднрд╛рдЧреЛрдВ рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рднрд╛рдЬрдХ (рдЬреИрд╕реЗ '' '' (рдЕрд╡рдзрд┐) рдпрд╛ ',' (рдХреЙрдорд╛)), рдФрд░ рд╕рд╛рде рд╣реА '+' рдФрд░ '' '' рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреНрд╖реЗрддреНрд░реАрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЗрд╡реЗрдВрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрджрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдо рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ
XXXChanged рдФрд░
XXXChanging рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, WPF рдЙрд╕реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореБрдЦреНрдп рдШрдЯрдирд╛ рдореЗрдВ рдЖрдЧ рди рд▓рдЧреЗред (рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдорд╛рдЙрд╕ рдпрд╛ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдХреБрдЫ рдХреБрдВрдЬреА рдпрд╛ рдЙрдирдХреЗ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рд░реЛрдХрдирд╛)ред
рдФрд░ рдЕрдЧрд░
TextChanged рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде
TextBox рд╡рд░реНрдЧ, рд╕рд╛рде рдореЗрдВ рдПрдХ
рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрдирдЯреИрдХреНрдЪреЗрдВрдЬ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рд╣рдо рдЗрдирдкреБрдЯ рдкрд╛рда рдХреЛ рдЧрд▓рдд рдорд╛рдирддреЗ рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдХреЛ "рдмрд╛рдзрд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЬрдм рд╕реЗ рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддрдм рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рд╕рдкреЗрдЯ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдирд╛
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕рдмрд╣реЗрд╡рд┐рдпрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд▓рдЧреНрди IsDoubleProperty рдЧреБрдг рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдореЗрдВ +, -, рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рджрд░реНрдЬ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ред (рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рднрд┐рдиреНрдирд╛рддреНрдордХ рднрд╛рдЧреЛрдВ рдХреЗ рд╡рд┐рднрд╛рдЬрдХ), рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛рдПрдВ (рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреНрд░реАрдо рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣рд╛рд░реНрдбрдХреЛрдб рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдирд╣реАрдВ)ред
public class TextBoxBehavior { // Attached , // public static readonly DependencyProperty IsDoubleProperty = DependencyProperty.RegisterAttached( "IsDouble", typeof (bool), typeof (TextBoxBehavior), new FrameworkPropertyMetadata(false, OnIsDoubleChanged)); // IsDouble // UI , TextBox [AttachedPropertyBrowsableForType(typeof (TextBox))] public static bool GetIsDouble(DependencyObject element) {} public static void SetIsDouble(DependencyObject element, bool value) {} // , TextBoxBehavior.IsDouble="True" XAML- private static void OnIsDoubleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // } }
рдкреНрд░реАрд╡реНрдпреВрдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рд╣реИрдВрдбрд▓рд░ (рд╕рд╛рде рд╣реА рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╕реЗ рдкрд╛рда рдХреЛ рдЪрд┐рдкрдХрд╛рдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдореБрдЦреНрдп рдЬрдЯрд┐рд▓рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рда рдХрд╛ рдХреБрд▓ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдирдпрд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдШрдЯрдирд╛ рддрд░реНрдХреЛрдВ рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХреНрд╖реЗрдк рдкрд╛рда рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкрд╛рда рдмреЙрдХреНрд╕ рдореЗрдВ рдкрд╛рда рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЗрд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд░реНрд╕рд░ рд╕реНрдерд┐рддрд┐ рдФрд░, рд╕рдВрднрд╡рддрдГ, рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ (рдЬрд┐рд╕рдХрд╛ рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ):
// , TextBoxBehavior.IsDouble="True" XAML- private static void OnIsDoubleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // attached // TextBox , - var textBox = (TextBox) d; // : // 1. // 2. textBox.PreviewTextInput += PreviewTextInputForDouble; DataObject.AddPastingHandler(textBox, OnPasteForDouble); }
рдХреНрд▓рд╛рд╕ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдбрдмрд▓рдбреЙрд▓реЗрдЧреЗрдЯрд░
рджреВрд╕рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдирдП рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкрд╛рда рдХреЗ рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдПрдХ рдЕрд▓рдЧ
TextBoxDoubleValidator рд╡рд░реНрдЧ рдХреЗ
IsValid рд╡рд┐рдзрд┐ рдХреЛ
рд╕реМрдВрдкреА рдЧрдИ рд╣реИ ред
рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреА
рдИрд╡реАрдПрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рд╕рднреА
рдХреЛрдиреЛрдВ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрдм рдкреИрд░рд╛рдореАрдЯрд░рд┐рдд рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рднрдпрд╛рдирдХ рдмрд▓ рдХреЗ рд╕рд╛рде рд╢рд╛рд╕рди рдХрд░рддреЗ рд╣реИрдВ):
рдиреЛрдЯ
рдпрд╣ рдмрд╕ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╕рд┐рд░реНрдл рдПрдХ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдареАрдХ рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдХрд┐ рдЬрдм рдЬрд╡рд╛рдмрджреЗрд╣реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдХреЗрдВрдЯ рдмреЗрдХ рдиреЗ рдмрд╛рд░-рдмрд╛рд░ рдмрд╛рдд рдХреА; рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, "рдкреБрди: рдЙрдкрдпреЛрдЧ" рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рддрд░реНрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдвреВрдВрдвреЗрдВ рдФрд░, рдЗрд╕рд▓рд┐рдП, рд╢рд╛рдпрдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдореЗрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ! private static void PreviewTextInputForDouble(object sender, TextCompositionEventArgs e) { // e.Text , // TextBox- var textBox = (TextBox)sender; string fullText; // TextBox , e.Text if (textBox.SelectionLength > 0) { fullText = textBox.Text.Replace(textBox.SelectedText, e.Text); } else { // fullText = textBox.Text.Insert(textBox.CaretIndex, e.Text); } // bool isTextValid = TextBoxDoubleValidator.IsValid(fullText); // TextChanged e.Handled = !isTextValid; }
рдпрджрд┐
рдкрд╛рда рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреНрдп рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐
рд╕рд╣реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкрд╛рда рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ
рдмреЙрдХреНрд╕ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбреАрдбрдмрд▓ рд╕рдВрд▓рдЧреНрди рд╣реИред рдХреГрдкрдпрд╛ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: (1)
рд╕реЗрдЯрдХрд▓реНрдЪрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ (2) рдХреБрдЫ рдЗрдирдкреБрдЯ рдорд╛рди, рдЬреИрд╕реЗ "-"ред, рдЬреЛ
рдбрдмрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред
рд▓реЛрдХреЗрд▓ рдХреА рд╕реНрдкрд╖реНрдЯ рд╕реНрдерд╛рдкрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рди рдкрдбрд╝реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░реВрд╕реА рд▓реЛрдХреЗрд▓ рдореЗрдВ, рдкреНрд░рддреАрдХ ',' (рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо) рдХреЛ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдореЗрд░рд┐рдХреА рдореЗрдВ - 'ред' (рдбреЙрдЯ)ред рдПрдХ рдЕрдЬреАрдм рдкрд╛рда рдЬреИрд╕реЗ "-"ред рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ "-1" рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкреВрд░реА рдХрд░рдиреА рд╣реЛрдЧреА, рдЬреЛ рдХрд┐
рдбрдмрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдорд╛рди рд╣реИред (рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ StackOverflow рдкрд░, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓
рдбрдмрд▓.рдЯреНрд░реАрдкрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред
рдиреЛрдЯ
рдореИрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд▓реЗрдЦ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдереНрд░реЗрдбрд▓реЛрдХрд▓ <рдЯреА> рдХреА рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЛ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдбрдмрд▓рд╕реЗрдкрд░реЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред TextBoxDoubleValidator.IsValid рд╡рд┐рдзрд┐ рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдереНрд░реЗрдбрд▓реЛрдХрд▓ <T> рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рдЕрд▓рдмрд╣рд╛рд░реА рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рднрд╛рдЧ рейрд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди
рдкреНрд░реАрд╡реНрдпреВрдЯреЗрдХреНрд╕реНрдЯ рдЗрдВрдкреБрдЯ рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдЪрд┐рдкрдХрд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп рдЙрдкрд╛рдп рднреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ
рдХрд┐рд╡реЗрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреБрдВрдЬреА рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде
PreviewKeyDown рдЗрд╡реЗрдВрдЯ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдХреЗ "рд╕рд╛рд░рд╛рдВрд╢" рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛрдирд╛ рд╣реИ, рдФрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рднрд┐рдиреНрдирд╛рддреНрдордХ рднрд╛рдЧреЛрдВ рдХрд╛ рд╡рд┐рднрд╛рдЬрдХ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ (
NumberFormatfo.NumberDecimalSeparator рдПрдХ
рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдирд╣реАрдВ)ред
KeyDown рдИрд╡реЗрдВрдЯ рдореЗрдВ
TextBox.Text рдХреА рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдФрд░ рдпрджрд┐ рдирдпрд╛ рдорд╛рди рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
TextChanged рдИрд╡реЗрдВрдЯ рдореЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд▓рдЧреНрди рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬрдм рд╣рдордиреЗ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде WPF рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдФрд░ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдХрдореА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА, рддреЛ рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рд╣реИред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрдмрд▓рддрд╛ рд╣реИ рдХрд┐
рдЫрд┐рджреНрд░рдкреВрд░реНрдг рдЕрдореВрд░реНрддрддрд╛ рдХреЗ
рдХрд╛рдиреВрди рд╕реЗ рдХреЛрдИ рдмрдЪ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ
, рдФрд░ WPF, "рдЕрдореВрд░реНрдд" рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдПрдХ рдЫрд▓рдиреА рдХреА рддрд░рд╣ рдмрд╣рддреА рд╣реИред рдЙрдкрдпреЛрдЧреА рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╣рдореЗрдВ рдХрднреА-рдХрднреА рд╕реЛрдЪрддреА рд╣реИ (!) рдФрд░ рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд╛рд░реАрдЧрд░ рдирд╣реАрдВ рд╣реИрдВред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рджрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг
рдЬреАрдердм рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред