silverlight2.0Beta版TextBox输入中文解决方法

  新写一个TextBoxEx控件,继承于TextBox,并对TextBox的选择事件及字符改变事件做处理,以下是原代码

  

复制代码 代码如下:

  /************************************************************************/

  /*

  作者:覃小春

  时间:20080826

  说明:解决silverlightBeta2中TextBox中文输入问题

  * blog:blog.csdn.net/colijian

  */

  /************************************************************************/

  using System.Windows;

  using System.Windows.Controls;

  namespace TextBoxEx

  {

  public class TextBoxEx:TextBox

  {

  #region 属性

  private string _OldText = "";

  private int _RecSelectStart = 0;

  private int _RecSelectLength = 0;

  #endregion

  public TextBoxEx()

  {

  TextChanged += new TextChangedEventHandler(TextBoxEx_TextChanged);

  SelectionChanged += new RoutedEventHandler(TextBoxEx_SelectionChanged);

  }

  void TextBoxEx_SelectionChanged(object sender, RoutedEventArgs e)

  {

  TextBox _sender = sender as TextBox;

  if (_sender == null)

  return;

  if (_sender.SelectionLength > 0)

  {

  //recode user select position

  _RecSelectLength = _sender.SelectionLength;

  _RecSelectStart = _sender.SelectionStart;

  }

  else

  {

  _RecSelectLength = 0;

  }

  }

  void TextBoxEx_TextChanged(object sender, TextChangedEventArgs e)

  {

  TextBox _sender = sender as TextBox;

  if (_sender == null)

  return;

  string textIfnor = _sender.Text;

  #region 除去先中部份

  if (_RecSelectLength != 0)

  {

  _OldText = _OldText.Substring(0, _RecSelectStart) + _OldText.Substring(_RecSelectStart + _RecSelectLength, _OldText.Length - _RecSelectStart - _RecSelectLength);

  _RecSelectLength = 0;

  }

  #endregion

  int LengthAdd = textIfnor.Length - _OldText.Length;

  if (LengthAdd <= 0)

  {

  _OldText = _sender.Text;

  //这种情况是删除数据

  return;

  }

  else if (LengthAdd % 2 == 0)

  {

  //如果当前是成双的情况下

  //得到当前字符串

  string AddInfor = textIfnor.Substring(_sender.SelectionStart - LengthAdd, LengthAdd);

  if (!AddInfor.Substring(0, AddInfor.Length / 2).Equals(AddInfor.Substring(AddInfor.Length / 2)))

  {

  _OldText = _sender.Text;

  return;

  }

  //得到实际新增值

  AddInfor = AddInfor.Substring(0, AddInfor.Length / 2);

  //得到实际理论值

  string DealText = textIfnor.Substring(0, _sender.SelectionStart - LengthAdd) + AddInfor + textIfnor.Substring(_sender.SelectionStart, textIfnor.Length - _sender.SelectionStart);

  int RecodeSelectSTart = _sender.SelectionStart - LengthAdd / 2;

  _sender.SelectionStart = 0;

  _sender.Text = DealText;

  _sender.SelectionStart = RecodeSelectSTart;

  _OldText = DealText;

  }

  else

  {

  _OldText = _sender.Text;

  }

  }

  }

  }

  使用:

  

复制代码 代码如下:

  <UserControl x:Class="MutilTextBox.Page"

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:CT="clr-namespace:TextBoxEx;assembly=TextBoxEx"

  Width="400" Height="300">

  <Grid x:Name="LayoutRoot" Background="White">

  <Grid.RowDefinitions>

  <RowDefinition Height="50"></RowDefinition>

  <RowDefinition Height="50"></RowDefinition>

  <RowDefinition Height="50"></RowDefinition>

  <RowDefinition Height="50"></RowDefinition>

  </Grid.RowDefinitions>

  <TextBox x:Name="FirstTextBox" Text="first" Grid.Row="0" TextChanged="FirstTextBox_TextChanged"></TextBox>

  <CT:TextBoxEx x:Name="SecondTextBox" Grid.Row="1"></CT:TextBoxEx>

  <CT:TextBoxEx x:Name="ThreeTextBox" Grid.Row="2"></CT:TextBoxEx>

  <TextBox x:Name="Four" Grid.Row="3" ></TextBox>

  </Grid>

  </UserControl>

注意:要先加入名称空间,具体的值是:

  clr-namespace:名称空间全名;assembly=程序集名称

  不清楚怎样上传程序集!否则将程序集上传

  若发此控件有问题,或是不足,请给我留言