今天碰到一个郁闷的问题,由于在输入法状态下,TextBox的KeyDown事件中捕获到的Key都是ImeProcessed,而MSDN中所说的能够根据e.ImeProcessedKey来取到真实的按下的键也完全是瞎说,从这里取到的也是ImeProcessed。郁闷之中,突然灵机一动,想到在系统自带的PasswordBox中是无法使用输入法的,于是使用Reflector查看了它的源代码,发现他在静态构造函数中做了如下设置:
代码
InputMethod.IsInputMethodEnabledProperty.OverrideMetadata(
typeof
(PasswordBox),
new
FrameworkPropertyMetadata(BooleanBoxes.FalseBox, FrameworkPropertyMetadataOptions.Inherits,
null
,
new
CoerceValueCallback(PasswordBox.ForceToFalse)));
简单来说就是可以通过设置InputMethod的一个名为IsInputMethodEnabled的附加属性来实现屏蔽输入法。
在WPF和SL中的使用方法分别如下:
WPF
<
Window
x:Class
="WpfModelViewApplication1.Views.MainView"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:input ="clr-namespace:System.Windows.Input;assembly=PresentationCore"
Title ="Main Window" Height ="400" Width ="800" >
< DockPanel >
< Grid x:Name ="grid1" >
< TextBox x:Name ="tb" Width ="100" HorizontalAlignment ="Right" Margin ="0,164,122,128" input:InputMethod.IsInputMethodEnabled ="False" />
</ Grid >
</ DockPanel >
</ Window >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:input ="clr-namespace:System.Windows.Input;assembly=PresentationCore"
Title ="Main Window" Height ="400" Width ="800" >
< DockPanel >
< Grid x:Name ="grid1" >
< TextBox x:Name ="tb" Width ="100" HorizontalAlignment ="Right" Margin ="0,164,122,128" input:InputMethod.IsInputMethodEnabled ="False" />
</ Grid >
</ DockPanel >
</ Window >
Sl
<
UserControl
x:Class
="SilverlightApplication1.MainPage"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:input ="clr-namespace:System.Windows.Input;assembly=System.Windows" >
< StackPanel x:Name ="LayoutRoot" >
< TextBox x:Name ="tb1" Width ="100" Height ="100" input:InputMethod.IsInputMethodEnabled ="False" />
</ StackPanel >
</ UserControl >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:input ="clr-namespace:System.Windows.Input;assembly=System.Windows" >
< StackPanel x:Name ="LayoutRoot" >
< TextBox x:Name ="tb1" Width ="100" Height ="100" input:InputMethod.IsInputMethodEnabled ="False" />
</ StackPanel >
</ UserControl >
一个很实用但是可能很少人知道的小功能,希望能够帮助到大家。