------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
为了提高用户体验,或者美化界面,为控件加入一些动态效果是一个好主意。今天我就演示如何令winform中的textbox随内容长度实时变动。
在开始之前,和大家分享下我在实现这个效果前遇到的一个主要问题。
一开始,我的想法是根据输入的字符串的长度textbox.text.lenth来改变textbox的宽度width。但实际操作后发现,text.lenth和width并不对等。或者说,lenth只是代表字符串的长度,不代表其“宽度”,即我们所看到的大小宽度。width为1的textbox并不能显示长度为1的字符。并且当输入的内容为汉字时,情况又不一样了,如果说宽度10能刚好放下一个字母、数字、或符号,当我们在宽度为10的textbox中输入1个汉字时,它却放不下了,这个汉字会被往左移,只显示右边部分。因此,我认为不同字符的长度与textbox的宽度的比值是有规律的。于是开始试验,结果却不是很完美,我没法归纳出其中的规律只能得到一个大概的比值。不过这也够用了。但要注意的是汉字与其他字符是不一样的。这个是关键,否则在输入的时候容易将内容往左边挤出textbox外。还有一点要注意的是,空格也要考虑进去。
好了,现在附上我的代码,不是很完美,但总体效果还是不错的。该方法只要在textbox的textchanged()事件中调用就行。
//方法1:令文本框随着输入文本的长度变化
public void Txt_changeWidth(object sender)
{
if (sender is TextBox)
{
if ((sender as TextBox).Text != "")
{
if ((sender as TextBox).Width < 200 || (sender as TextBox).TextLength <= 16)
{
if ((sender as TextBox).TextLength >= 1)
{
//判断是否为汉字,关键
const string pattern1 = @"^[\u4e00-\u9fa5]+$";
Graphics g = (sender as TextBox).CreateGraphics();
System.Drawing.SizeF s = g.MeasureString((sender as TextBox).Text, (sender as TextBox).Font);
if (Regex.IsMatch((sender as TextBox).Text, pattern1))
{
(sender as TextBox).Width = (int)s.Width + 14;
}
else
{
(sender as TextBox).Width = (int)s.Width + 8;
}
}
}
}
else
{
//没内容时回到初始大小
(sender as TextBox).Width = 63;
}
}
}