WPF/SL中如何在TextBox屏蔽中屏蔽输入法
今天碰到一个郁闷的问题,由于在输入法状态下,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>
一个很实用但是可能很少人知道的小功能,希望能够帮助到大家。