WPF/SL中如何在TextBox屏蔽中屏蔽输入法

     今天碰到一个郁闷的问题,由于在输入法状态下,TextBox的KeyDown事件中捕获到的Key都是ImeProcessed,而MSDN中所说的能够根据e.ImeProcessedKey来取到真实的按下的键也完全是瞎说,从这里取到的也是ImeProcessed。郁闷之中,突然灵机一动,想到在系统自带的PasswordBox中是无法使用输入法的,于是使用Reflector查看了它的源代码,发现他在静态构造函数中做了如下设置:

代码
InputMethod.IsInputMethodEnabledProperty.OverrideMetadata(typeof(PasswordBox), new FrameworkPropertyMetadata(BooleanBoxes.FalseBox, FrameworkPropertyMetadataOptions.Inherits, nullnew 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>
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>

 

一个很实用但是可能很少人知道的小功能,希望能够帮助到大家。

posted on 2010-03-31 22:07  yingql  阅读(4937)  评论(1编辑  收藏  举报

导航