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 } } }