WPF中自动增加行(动画)的TextBox

WPF中自动增加行(动画)的TextBox
原文:WPF中自动增加行(动画)的TextBox

WPF中自动增加行(动画)的TextBox

WPF中的Textbox控件是可以自动换行的,只要设置TextWrapping属性为”Wrap”即可,但是存在一个问题:Textbox的高度是固定的,当输入文本过多时就会出现如下情况。

Textbox虽然没有自动增加高度的属性,但是我们可以通过设置来实现这一个功能。相关xaml代码如下

 <Grid VerticalAlignment="Top" HorizontalAlignment="Left" Width="36" Height="100"><TextBox x:Name="textBox" TextWrapping="Wrap" VerticalAlignment="Top" /></Grid>

效果如下
这里写图片描述

这里需要注意的是

  • 如果设置了textBox的Width、Height或者Margin属性,那么此textBox的大小就已经限制死了,不会自动增加,会出现上图中的情况。
  • 如果想设置textBox的大小和位置,需要把textBox放在一个Grid中,通过Grid的属性来控制textBox(上文中xaml文件中的方法)

其实到此为止所需要的功能已经实现了,但是为了让让textbox更美观,我加了一个动画

效果如下:

表面上看是一个textbox,其实是一个Grid加上2个textBox(一个显示,一个隐藏),xaml代码如下

<Grid><TextBox x:Name="txtVisible" TextWrapping="Wrap"/><TextBox x:Name="txtHidden" TextWrapping="Wrap" Visibility="Hidden" VerticalAlignment="Top"/>
</Grid>

Grid是用来控制textbox的大小的,两个textbox中,显示的那个用于输入文字,隐藏的用于触发动画。原理如下
在txtVisible中输入文字的同时,txtVisible把text传递给txtHidden,当txtHidden中的内容已经满一行时,会触发SizeChange事件,这个事件再触发txtVisible高度变化动画。代码如下

public partial class txt : UserControl
{private HeightAnimation anim;private double _animationDuration;public txt(){InitializeComponent();// Initialize the animationanim = new HeightAnimation(this);AnimationDuration = 500; //default value// Add the handlers to the required eventstxtHidden.SizeChanged += TxtHidden_SizeChanged;txtVisible.TextChanged += TxtVisible_TextChanged;}/// <summary>/// Gets or sets a value indicating whether the control is animated on loaded./// </summary>public bool AnimateOnLoaded { get; set; } = false;/// <summary>/// Gets or sets a value indicating whether the control is animated./// </summary>public bool IsAnimated { get; set; } = true;/// <summary>/// Gets or sets the duration of the animation./// </summary>public double AnimationDuration{get { return _animationDuration; }set{_animationDuration = value;anim.Duration = new Duration(TimeSpan.FromMilliseconds(value));}}/// <summary>/// Gets or sets the text contents of the AnimatedTextBox./// </summary>public string Text{get { return txtHidden.Text; }set{txtHidden.Text = value;txtVisible.Text = value;}}private void TxtVisible_TextChanged(object sender, TextChangedEventArgs e){// When the user's writing in txtVisible, we copy the text to txtHiddentxtHidden.Text = txtVisible.Text;}private void TxtHidden_SizeChanged(object sender, SizeChangedEventArgs e){OnHeightChanged(e.PreviousSize.Height, e.NewSize.Height);}/// <summary>/// To execute when the txtHidden's Height has changed./// </summary>private void OnHeightChanged(double previousHeight, double newHeight){//Animation type, increase txtVisible's height or decreaseanim.ChangeType = (newHeight > previousHeight) ? HeightAnimation.ChangeTypes.Increased : HeightAnimation.ChangeTypes.Decreased;// Animate the Height from the txtHidden's previousHeight to its newHeightanim.From = previousHeight;anim.To = newHeight;// Start the animationanim.BeginAnimation();}/// <summary>/// Manages the AnimatedTextBox Height's animation./// </summary>private class HeightAnimation{private Storyboard sb;private DoubleAnimation anim;private double _from;private double _to;private Duration _duration;private FrameworkElement _fe;private ChangeTypes _changeType;/// <summary>/// The possible types of the Height change./// </summary>public enum ChangeTypes{Increased,Decreased}/// <summary>/// Constructor of the class./// </summary>public HeightAnimation(FrameworkElement fe){// Set the FrameworkElement which manages the animation_fe = fe;// Initialize the Storyboardsb = new Storyboard();sb.AutoReverse = false;// Initialize the animationanim = new DoubleAnimation();anim.Name = "anim";// Set the EasingFunction on a new instance of CubicEase whose EasingMode is EaseInOutanim.EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseInOut };// Bind the Animation with the txtVisible TextBoxStoryboard.SetTargetName(anim, "txtVisible");// Add the animation to the Storyboard's childrensb.Children.Add(anim);}/// <summary>/// Gets or sets the type of the Height change./// </summary>public ChangeTypes ChangeType{get { return _changeType; }set{_changeType = value;/* If the Height has inreased, set the target property to MaxHeight, else to MinHeight* (instead of animating directly the Height, we animate MaxHeight/MinHeight to prevent the AnimatedTextBox* from growing/shrinking suddenly) */Storyboard.SetTargetProperty(anim, new PropertyPath(string.Format("(TextBox.{0})", (value == ChangeTypes.Increased) ? "MaxHeight" : "MinHeight")));}}/// <summary>/// Gets or sets the animation's starting Height./// </summary>public double From{get { return _from; }set{_from = value;anim.From = value;}}/// <summary>/// Gets or sets the animation's ending Height./// </summary>public double To{get { return _to; }set{_to = value;anim.To = value;}}/// <summary>/// Gets or sets the animation's duration./// </summary>public Duration Duration{get { return _duration; }set{_duration = value;anim.Duration = value;}}/// <summary>/// Begins the animation./// </summary>public void BeginAnimation(){_fe.BeginStoryboard(sb);}}
}
posted on 2019-01-15 17:08 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10272989.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基因婴儿事未了!人类将在2031年开始实现永生?

来源:WPR前段时间&#xff0c;中国首例“基因编辑”婴儿事件闹得沸沸扬扬&#xff0c;这件事也发酵到了国外&#xff0c;不到一天&#xff0c;各路外媒全部刷屏了。在这些外媒报道里&#xff0c;最有意思的要数《纽约时报》杂志了。他们就“基因编辑”问题&#xff0c;请到了作…

Tensorflow深度学习应用(进阶篇)

#codinggbk进阶篇相关数据&#xff1a;标签&#xff1a;要预测的事物特征&#xff1a;用于描述数据的输入变量样本&#xff1a;数据的特定实例有标签的样本&#xff1a;{特征&#xff0c;标签}无标的样本&#xff1a;{特征&#xff0c;...}模型&#xff1a;将样本映射到预测标签…

Java之Synchronized与锁升级

Synchronized与锁升级 一、概述 在多线程并发编程中 synchronized 一直是元老级角色&#xff0c;很多人都会称呼它为重量级锁。但是&#xff0c;随着 Java SE 1.6 对 synchronized 进行了各种优化之后&#xff0c;有些情况下它就并不那么重了。 本文详细介绍 Java SE 1.6 中为…

机器学习算法

最近&#xff0c;机器学习岗位越来越火爆&#xff0c;那么自然对算法的一些能力要求也是越来越高&#xff0c;想要在求职者中脱颖而出&#xff0c;起步自然非常重要。 我和小伙伴们一起研讨了 2019 年校招的一些算法面试&#xff0c;有些是亲自经历的&#xff0c;也有伙伴分享的…

深度强化学习在智能城市领域应用介绍

来源&#xff1a;海豚数据科学实验室深度强化学习是近年来热起来的一项技术。深度强化学习的控制与决策流程必须包含状态&#xff0c;动作&#xff0c;奖励是三要素。在建模过程中&#xff0c;智能体根据环境的当前状态信息输出动作作用于环境&#xff0c;然后接收到下一时刻状…

Tensorflow深度学习应用(进阶篇)-回归(函数拟合训练)-可视化

#codinggbk进阶篇&#xff1a;多元回归&#xff1a;建模问题&#xff1a;Yx1xx1x2xw2x3xw3...xnxwnb,矩阵简化表示YXWbnumpy库基础&#xff1a;整型的一个数字&#xff0c; 不能取得其shape&#xff08;维度&#xff09;&#xff0c;通过np.array()可以将其转换成一个标量&…

Tensorflow深度学习应用(进阶篇)-1

#codinggbk 逻辑回归&#xff1a;逻辑回归需要将输出控制在[0,1]之间&#xff0c;可以使用函数将值映射在[0,1]之间Sigmod函数&#xff0c;逻辑回归一般采用对数损失函数&#xff1b;from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei] #设置显示绘图显示中文 mp…

​20210716未来智能实验室收录资料

20210716未来智能实验室收录资料特别推荐&#xff1a;置顶收录未来智能实验室在人民日报《学术前沿》发表的城市大脑最新综述研究论文和报告《城市大脑的起源、发展与未来趋势》。本期收录前沿科技进展材料52篇1.《科学》&#xff1a;媲美AlphaFold2的蛋白质结构预测新工具问世…

元宇宙深度研究报告:元宇宙是互联网的终极形态?

报告出品方&#xff1a;华安证券作者&#xff1a;尹沿技、张天、姚天航1 元宇宙&#xff1a;剑指互联网的“终极形态”1.1 元宇宙指向互联网的终极形态元宇宙&#xff08;Metaverse&#xff09;概念起源于科幻小说&#xff0c;或指向互联网的“终极形态”。Metaverse 一词来源于…

Unity基础

Unity3D 游戏开发 第一章 基础知识 Unity是一个用于创建游戏和三维互动内容的开发工具&#xff0c;是一个专业游戏引擎。 2D游戏&#xff1a;视角锁定&#xff0c;二维坐标。 3D游戏&#xff1a;任意视角&#xff0c;三维坐标。 虚拟现实&#xff08;VR&#xff09;&#x…

英特尔史上最大收购!英特尔拟300亿美元收购GF,审批成关键!

来源&#xff1a;EETOP据《华尔街日报》报道&#xff0c;知情人士称&#xff0c;英特尔打算斥资约300 亿美元收购晶圆代工大厂格罗方德&#xff08;GlobalFoundries&#xff09;&#xff0c;以加速生产更多芯片&#xff0c;如果收购成功&#xff0c;这将是英特尔有史以来最大的…

Unity 基本操作

基本操作 物体的组合 1.从需要的组合的物体中选择一个作为父对象&#xff0c;其他的物体作为子对象&#xff0c;即把子对象拖拽到父对象里&#xff0c;操作父对象即可实现整体操作&#xff0c;效果如下。 2.在组合物体中&#xff0c;父对象的坐标是该组合体的坐标&#xff0c…

OpenAI雄心勃勃的机器人计划失败了:强化学习没法用?

来源&#xff1a;机器之心曾经训练出单手解魔方机器人的 OpenAI&#xff0c;眼下已经解散了机器人团队。这家执着于实现通用人工智能&#xff08;AGI&#xff09;的公司现在放弃了机器人研究&#xff0c;理由是「数据不够丰富」。近期&#xff0c;OpenAI 公司联合创始人 Wojcie…

Unity-游戏小地图实战(前述知识点回顾与运用)

阶段知识回顾与运用---游戏中小地图实战 对于多个摄像机&#xff0c;每个摄像机都带有音频监听器&#xff0c;会出现错误&#xff0c;因为我们只需要一个音频监听器&#xff0c;为了消除错误&#xff0c;需要移除其他摄像机的音频监听器&#xff0c;只保留主摄像机的音频监听器…

NTT高级科学家:光子是深度学习的未来!光子有望替代电子计算机加速神经网络计算...

来源&#xff1a;AI科技评论作者&#xff1a;Ryan Hamerly编译&#xff1a;陈彩娴近日&#xff0c;来自日本 NTT 研究所的高级科学家 Ryan Hamerly 在 IEEE Spectrum 上发表了一篇文章&#xff08;“The Future of Deep Learning Is Photonic”&#xff09;&#xff0c;谈论了光…

Unity3D-InstantOC遮挡剔除

InstantOC&#xff08;插件&#xff09; 渲染管线 图形数据在GPU上经过运算处理&#xff0c;最后输出到屏幕的过程。对于显示出来的图形&#xff0c;CPU与GPU的分工 CPU判断需要显示的图形图像调用图形API&#xff1b;绘制调用&#xff08;Draw Call&#xff09;&#xff1a;每…

WCF系列(一)BasicHttpBinding 和 WsHttpBinding 的不同点

aaaaaaaaaaaaaaaaaa WCF系列&#xff08;一&#xff09;【翻译】BasicHttpBinding 和 WsHttpBinding 的不同点 2010-02-21 12:23 by Virus-BeautyCode, 20206 阅读, 7 评论, 收藏, 编辑 原文地址&#xff1a;Difference between BasicHttpBinding and WsHttpBinding 1、简介 WC…

Unity3D-光照系统

光照系统 1. Global Illumination&#xff08;全局光照&#xff09; GI,能够计算直接光&#xff0c;间接光&#xff0c;环境光以及反射光的光照系统。通过GI算法&#xff0c;渲染出光照效果更为真实的场景。 2. 直接光 从光源直接放出的光&#xff0c;通过Light组件实现。 …

Tomaso A.Poggio教授丨人工智能的下一个突破点在何处?

来源&#xff1a;图灵人工智能AI的成功故事在过去的25年中&#xff0c;尤其是在刚刚过去的十年中&#xff0c;AI&#xff0c;特别是机器学习&#xff0c;已经拥有了十足可观的进展。两个主要的成功故事第一个是AlphaGo。在虚拟的游戏世界中&#xff0c;AI绝对已经战胜了人类。A…

Unity3D-声音系统

声音 1.Unity3D支持的音频文件 mp3、ogg、wav、aif、mod、it、s3m、xm。 2.声音分为2D&#xff0c;3D两种 3D声音:有空间感&#xff0c;近大远小&#xff1b;2D声音&#xff1a;适合做背景音乐。 3.在场景中产生声音&#xff0c;主要有两个总要的组件&#xff1a; Audio …