有沒有什麼辦法將WPF的KeyEventArgs.Key
轉換爲Char
?KeyEventArgs.Key to char
我試圖用KeyInterop
:
var x = (Char)KeyInterop.VirtualKeyFromKey(e.Key);
數字和它工作正常的信件,但對於其他字符沒有。 例如對於OemComma
它返回'1/4'而不是','。
我需要它來防止用戶輸入除TextBox
以外的任何字符,除了數字和分隔符(即逗號或句點)。
有沒有什麼辦法將WPF的KeyEventArgs.Key
轉換爲Char
?KeyEventArgs.Key to char
我試圖用KeyInterop
:
var x = (Char)KeyInterop.VirtualKeyFromKey(e.Key);
數字和它工作正常的信件,但對於其他字符沒有。 例如對於OemComma
它返回'1/4'而不是','。
我需要它來防止用戶輸入除TextBox
以外的任何字符,除了數字和分隔符(即逗號或句點)。
爲什麼這樣的做法?有阻止用戶執行此類輸入的不同方法。例如,爲TextBox.TextChanged
-event定義事件處理程序,並在輸入不是小數或分隔符時,撤消輸入。
private void textChangedEventHandler(object sender, TextChangedEventArgs args){
//args contains a property `Changes` where you can see what happened
//check for invalid characters and revoke them
}
我用[ PreviewTextInput(HTTP://毫秒dn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.WINDOWS.UIELEMENT.PREVIEWTEXTINPUT);k(VS.XAMLEDITOR);k(SOLUTIONITEMSPROJECT);k(TargetFrameworkMoniker-%22。NETFRAMEWORK%2cVERSION%3dV4.0%22)&RD =真)。不過謝謝。 – 2013-03-13 06:33:23
發現這個地方,我忘記了。仍然使用它,不知道它有什麼漏洞,但據我所知,它的工作。
public static class KeyEventUtility
{
// ReSharper disable InconsistentNaming
public enum MapType : uint
{
MAPVK_VK_TO_VSC = 0x0,
MAPVK_VSC_TO_VK = 0x1,
MAPVK_VK_TO_CHAR = 0x2,
MAPVK_VSC_TO_VK_EX = 0x3,
}
// ReSharper restore InconsistentNaming
[DllImport("user32.dll")]
public static extern int ToUnicode(
uint wVirtKey,
uint wScanCode,
byte[] lpKeyState,
[Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)]
StringBuilder pwszBuff,
int cchBuff,
uint wFlags);
[DllImport("user32.dll")]
public static extern bool GetKeyboardState(byte[] lpKeyState);
[DllImport("user32.dll")]
public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
public static char GetCharFromKey(Key key)
{
char ch = ' ';
int virtualKey = KeyInterop.VirtualKeyFromKey(key);
var keyboardState = new byte[256];
GetKeyboardState(keyboardState);
uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
var stringBuilder = new StringBuilder(2);
int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
switch (result)
{
case -1:
break;
case 0:
break;
case 1:
{
ch = stringBuilder[0];
break;
}
default:
{
ch = stringBuilder[0];
break;
}
}
return ch;
}
}
對於此代碼中的錯誤,請參閱此處的註釋:http://stackoverflow.com/a/5826175/187650 – juFo 2016-11-15 11:30:56
我的第一個建議是使用PreviewTextInput和使用TextCompositionEventArgs。 然而這'吃'空間字符。 對於這種「space'發出看:
另一個解決方案是使用KeyConverter在KEYUP事件:
KeyConverter kc = new KeyConverter();
var str = kc.ConvertToString(e.Key);
對於WPF:https://msdn.microsoft.com/en-us/library/system.windows.input.keyconverter(v=vs.110).aspx 對於的WinForms:https://msdn.microsoft.com/en-us/library/system.windows.forms.keysconverter.aspx
注意KeyConverter會給你字符串 「空間」,而不是 「」。 (同樣按下ESC鍵時爲 「ESC」
另一個WPF溶液在KEYUP事件中使用這樣的:
((char)KeyInterop.VirtualKeyFromKey(e.Key))
http://stackoverflow.com/questions/5825820/how-to - 如何將字符轉換爲等價的System.Windows.Input.Key枚舉值?](http:// stackoverflow) - 可能的重複字符不同的區域設置鍵盤在wpf-c – Alex 2013-03-12 11:02:24
.com/questions/544141/how-to-convert-a-character-in-to-equivalent-system-windows-input-key-enum-value) – 2013-03-12 11:04:04
試試'KeyConverter.ConvertToString'而不是 – Rachel 2013-03-12 12:50:56