问题描述
silverlight Beta 2.0 中TetBox输入汉字,除MS自己的输入法,其它所有输入法都会出现输入的东西会在TextBox中重复一次的现像,Google,BaIDu了一下,大家说好像是silverlight自己的一个BUG,可能会在Repleass的时候修改。
解决办法:
新写一个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=程序集名称
不清楚怎样上传程序集!否则将程序集上传
若发此控件有问题,或是不足,请给我留言
总结以上是内存溢出为你收集整理的silverlight2.0Beta版 TextBox中文输入解决办法全部内容,希望文章能够帮你解决silverlight2.0Beta版 TextBox中文输入解决办法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)