wpf 输入字符长度限制

         wpf里很多控件比如像textbox,就存在Maxlength这样的属性,直接设置6,就可以

限制客户输入6个字符了,但是很多控件就没有这样的现成的属性。尤其是写第三方的控

件,C1Felxgrid,Xceed.Wpf.DataGrid.DataGridControl这些控件的cell内,也需要限制

长度的时候就傻眼了。不可能这么多控件都去一一研究他们怎么控制。搞半天,也很难

找到解决的方案。

         看到有很多种方法,有个方案就是将原来控件值,用个变量记录起来,当不符合逻

辑限制的时候,将控件值,修改为保存的old value。很多时候不仅得增加控件的key up事

件,还得研究获取控件的值,和设置控件的值。非常麻烦。

       今天我发现个新的思路,就是当有不需要输入的字符,或者长度限制到了时候,模拟

键盘输入一个backspace键。这样完美解决,不用去寻找设置控件值的方法。

参考下面代码:

private void _dataGrid_KeyUp(object sender, KeyEventArgs e)
{
int constraintValue = 6;
Xceed.Wpf.DataGrid.DataRow row = _dataGrid.GetContainerFromItem(_dataGrid.CurrentItem) as Xceed.Wpf.DataGrid.DataRow;
object content = row.Cells[1].Content;
if (content.ToString().Length > constraintValue)
{
   //row.Cells[1].Content = content.ToString().Substring(0, constraintValue);    
   System.Windows.Forms.SendKeys.SendWait("{BACKSPACE}"); 
}
}

这种方法的优点就是,比较通用,那个控件想控,都可以使用这个套路解决。

下面收集写常用键的发送方法:

 SendKeys.SendWait("^s");       //发送 Ctrl + s 键
 SendKeys.SendWait("%{F4}");      // 发送 Alt + F4 键
            /*按键 代码 
            BACKSPACE {BACKSPACE}, {BS}, 或 {BKSP} 
            BREAK {BREAK} 
            CAPS LOCK {CAPSLOCK} 
            DEL or DELETE {DELETE} 或 {DEL} 
            DOWN ARROW {DOWN} 
            END {END} 
            ENTER  {ENTER}或 ~ 
            ESC {ESC} 
            HELP {HELP} 
            HOME {HOME} 
            INS or INSERT {INSERT} 或 {INS} 
            LEFT ARROW {LEFT} 
            NUM LOCK {NUMLOCK} 
            PAGE DOWN {PGDN} 
            PAGE UP {PGUP} 
            PRINT SCREEN {PRTSC} 
            RIGHT ARROW {RIGHT} 
  SendKeys.SendWait("+{TAB}");
           SendKeys.SendWait("%f");//alt+f
           SendKeys.SendWait("{Tab}");
           SendKeys.SendWait("{Enter}")
多次按键的代码
为了指定重复键,使用 {key number} 的形式。必须在 key 与 number 之间放置一个空格。例如,{LEFT 42} 意指 42 次按下 
LEFT ARROW 键;{h 10} 则是指 10 次按下 H 键

wpf的中的正确用法:

private void StrMessage_KeyDown(object sender, KeyEventArgs e)
{   
           if (e.Key == Key.Enter)
           {
               Send(Key.Tab);
           }
 }
        public static void Send(Key key)
        {
            if (Keyboard.PrimaryDevice != null)
            {
                if (Keyboard.PrimaryDevice.ActiveSource != null)
                {
                    var e = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, key)
                    {
                        RoutedEvent = Keyboard.KeyDownEvent
                    };
                    InputManager.Current.ProcessInput(e);
 
                    // Note: Based on your requirements you may also need to fire events for:
                    // RoutedEvent = Keyboard.PreviewKeyDownEvent
                    // RoutedEvent = Keyboard.KeyUpEvent
                    // RoutedEvent = Keyboard.PreviewKeyUpEvent
                }
            }
        }

你可能感兴趣的:(C#,wpf)