zoukankan      html  css  js  c++  java
  • Windows App开发之编辑文本与绘制图形

    编辑文本及键盘输入

    相信大家都会使用TextBox,但假设要让文本在TextBox中换行该怎么做呢?将TextWrapping属性设置为Wrap,将AcceptsReturn属性设置为True就好咯。

    PasswordBox非常明显就是一个password框了。和其它的控件相比其有2个特殊之处。一个是其能够用MaxLength来控制最大的长度,一个是用PasswordChanged来捕捉password的改名。显然比方QQpassword的MaxLength就是16位了,而PasswordChanged能够用来监測比方用户设置的password和username是否相同。

    大家在用电脑或者手机输入时偶尔键盘是出来的26字母拼音或是26字母英文亦或是10个数字对吧。那这个是怎么实现的呢?相同也是非常easy的噢!

    直接在TextBox上用InputScope属性就好啦,比方有Default、TelephoneNumber、EmailSmtpAddress、Url、Search、Chat等能够设置。

    除了在XAML中设置InputScope属性外,也能够在后台C#文件里设置。

    InputScope inputScope = new InputScope();
    InputScopeName inputScopeName= new InputScopeName();
    inputScopeName.NameValue = InputScopeNameValue.TelephoneNumber;
    inputScope.Names.Add(scopeName);
    phoneNumberTtBox.InputScope = scope;

    在这段代码中,phoneNumberTtBox是TextBox的名字哟。或者也能够简写这段代码的:

    phoneNumberTtBox.InputScope = new InputScope() 
    {
        Names = {new InputScopeName(InputScopeNameValue.TelephoneNumber)}
    };
    

    除此之外,我们还能够给RichEditBox控件设置IsSpellCheckEnabled属性让这个文本控件启用拼写检查。另外值得注意的是TextBox控件的拼写检查仅仅在Windows Phone上启用,在Windows上市禁用的。而文本预測属性在TextBox和RichEditBox以及在Windows和Windows Phone上都是可用的哦,也就是IsTextPredictionEnabled。

    情节提要动画与关键帧动画

    简单动画演示样例

    由于以下这些Rectangle都是在ItemsControl中的,由于在容器控件中应用主题样式时。其全部的子对象也都会继承下来。

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ItemsControl Grid.Row="1" x:Name="itemsControlRectangle">             
            <ItemsControl.ItemContainerTransitions>
                <TransitionCollection>
                    <EntranceThemeTransition/>
                </TransitionCollection>
            </ItemsControl.ItemContainerTransitions>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapGrid Height="400"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
    
            <ItemsControl.Items>
                <Rectangle Fill="Red" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Wheat" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Yellow" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Blue" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Green" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Gray" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="White" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Gainsboro" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Magenta" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="CadetBlue" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="NavajoWhite" Width="100" Height="100" Margin="12"/>
                <Rectangle Fill="Khaki" Width="100" Height="100" Margin="12"/>
            </ItemsControl.Items>
        </ItemsControl>
    </Grid>

    情节提要动画

    就像我们前面介绍的定义样式资源一样,我们也能够将动画设为资源。

    <Page.Resources>
        <Storyboard x:Name="storyboardRectangle" >
            <DoubleAnimation
                Storyboard.TargetName="rectangle"  
                Storyboard.TargetProperty="Opacity"                
                From="1.0" To="0" Duration="0:0:1"
                AutoReverse="True"
                RepeatBehavior="Forever"/>          
        </Storyboard>
    </Page.Resources>
    
    <Grid>
        <Rectangle x:Name="rectangle"       
            Width="200" Height="130" Fill="Blue"/>
    </Grid>

    在理解这些代码意思之前,还是先让动画跑起来,你能够加上一个Button并设置其Click事件。也能够在MainPage方法下直接写例如以下代码:

    storyboardRectangle.Begin();

    执行应用后。Rectangle的透明度就会渐渐的消失而后出现。

    在上面这个演示样例中,我们为Rectangle的Opacity(透明度)属性设置了动画。Storyboard通常存放在

    Storyboard.TargetProperty="(rectangle.Fill).(SolidColorBrush.Color)"

    假设你已经定义了TargetName属性为rectangle。那么Fill前的rectangle和点都能够去掉。

    左右两个括号都是必要的,它表示一个属性的名称。中间的点意味着要先获取第一个括号的属性。也就是设置动画的相应对象,然后进入到其对象模型中。此处是Color。官网上还给出了其它演示样例:

    (UIElement.RenderTransform).(TranslateTransform.X) 应用到RenderTransform上。并创建TranslateTransform的X值的动画

    (Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color) 应用到Fill上。并在LinearGradientBrush的GradientStop内创建Color的动画。这里方括号内的数字表示索引,表示集合中的一项,索引从0開始

    (UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X) 应用到RenderTransform上,并创建TranslateTransform

    我们还注意到。动画中还有From和To属性。顾名思义,From表示动画的開始值。To表示结束值。

    假设未定义From值。那么动画起始值为该对象属性的当前值。

    假设想要设置一个和起始值相对的结束值,建议使用By属性。

    动画在这3个属性中至少应该设置一个。否则动画便不会更改值。且这3个属性也无法同一时候存在。

    我们还能够用设置AutoReverse属性为真以使动画才结束后自己主动进行反向播放,但反向播放完后不会再继续播放。

    设置RepeatBehavior属性为“1x”表示动画的播放次数,或者也能够直接设为“Forever”,让其永远播放。

    假设动画较多的情况下。我们哈能够设置BeginTime来使不同的动画错开播放。

    关键帧动画

    什么是关键帧动画?

    关键帧动画建立在上文的情节提要动画概念智商,它令动画沿着一条时间线来逐步达到多个目标值。也就是说假设要让上文的Fill属性从Blue变化到Lime之间还能够令其先变化到Red或Orange等。

    更为巧妙的是,你能够同一时候指定不同的属性来制作复杂的动画。

    假设略微会一点Flash,对于关键帧的概念肯定没有问题。

    1.线性关键帧

    我们为动画设置一个KeyTime来表示间隔的时间戳,比如我们能够设置4个时间戳为:KeyTime=”0:0:0”、”0:0:2”、”0:0:8”、”0:0:9”,能够看到动画在中间部分时跳跃性非常之大。

    但其动画都是缓慢变化的,由于这是线性的,另一种第二种关键帧它会让动画在时间戳上产生突变而不是渐变。这就是离散式关键帧(就像概率论中的离散型和连续型一样)。

    2.样条关键帧

    其主要通过KeySpline属性来建立过渡,比如KeySpline=”0.1,0.1 0.7.0.8”,这里有两个点,分别相应贝塞尔曲线的第一个控制点和第二个控制点。描写叙述了动画的加速情况。

    关于贝塞尔曲线,建议大家看看维基百科,在图形化编程中非经常常使用。

    3.缓动关键帧

    这样的模式就更加高级了。它由多个提前定义好的数学公式来控制。

    以下是的缓动函数列表来源于网络:

    BackEase:动画開始在指定路径上运动前略微收缩动画的执行。
    BounceEase:创建回弹效果。
    CircleEase:使用圆函数创建加速或减速的动画。
    CubicEase:使用函数 f(t) = t3 创建加速或减速的动画。
    ElasticEase:创建一个动画,模拟弹簧的来回振荡运动。直到它达到停止状态。


    ExponentialEase:使用指数公式创建加速或减速的动画。
    PowerEase:使用公式 f(t) = tp 创建加速或减速的动画,当中 p 等于 Power 属性。
    QuadraticEase:使用函数 f(t) = t2 创建加速或减速的动画。
    QuarticEase:使用函数 f(t) = t4 创建加速或减速的动画。
    QuinticEase:使用函数 f(t) = t5 创建加速或减速的动画。
    SineEase:使用正弦公式创建加速或减速的动画。

    绘制图形

    Rectangle

    我们开篇先介绍一个之前用过。也是比較简单的Rectangle。简单的矩形就仅仅用定义长和宽了,但假设要有圆角的话呢。用RadiusX和RadiusY就好。那么RadiusX和RadiusY究竟是什么呢?看看下图就知道了。

    <Rectangle Fill="Yellow" Width="300" Height="200" Stroke="Blue"
                       StrokeThickness="10" RadiusX="80" RadiusY="40"/>

    这里写图片描写叙述

    和Rectangle相似,Border也能够创建矩形,并且后者还能够有自对象以及会自己主动调整大小。前者仅仅能有固定的大小哦。

    Ellipse

    看到这个名字大家应该都知道是什么意思吧,假设要定义成圆的话让Height和Width属性相等就可以。

    那童鞋们都知道ProgressRing是由6个Ellipse组成的吗,RadioButton也是由2个同心的Ellipse组成的哦。

    <Ellipse Fill="Blue" Height="200" Width="350"/>

    Polygon

    Polygon则显得比較自由,仅仅须要定义出各个顶点。它就会将这些点连接起来。

    那么我们可能会有疑问,需不须要确定图形的起始点和终点呢?答案是不用的,由于Polygon会自己主动将终点和起始点连接起来(它会假设图形是闭合的)。

    <Polygon Fill="Green" Points="0,0,100,0,100,100,0,100  "/>

    这里写图片描写叙述

    假设要在后台C#文件里来写的话呢,原本的Point则由PointCollection来定义全部点后加入到一起。

    Line

    Line的使用也比較简单,但有一点要注意,必须设置好Stroke和StrokeThickness的属性值,否则Line就不会显示出来。原因非常easy。由于它是直线。

    <Line Stroke="Red" StrokeThickness="10" X1="100" Y1="0" Y2="400" X2="400"/>

    这里写图片描写叙述

    Path

    最后上台的自然是最厉害的啦。先上图。

    这里写图片描写叙述

    <Path Stroke="Gold"  StrokeThickness="7" 
                  Data="M 0,0 C 100,200 50,200 40,150 H 200 V 100 "/>

    前两个属性用过多次了。Data却还挺复杂的。这里有3个命令,M、C、H和V。假设按英文来记可能会easy些吧,各自是:Move、Control、Horizontal和Vertical。

    那么,重头戏来了。先看图^_^

    这里写图片描写叙述

    接着上代码。

      <Path Stroke="Black" StrokeThickness="1" Fill="red">
                    <Path.Data>
                        <GeometryGroup>           
                            <RectangleGeometry Rect="5,5 180,10" />
                            <RectangleGeometry Rect="5,5 95,180" />  
                            <RectangleGeometry Rect="90,175 95,180"/>   
                            <RectangleGeometry Rect="5,345 180,10" />    
                            <EllipseGeometry            
                                Center="95, 180" RadiusX="20"   
                                RadiusY="30"/>                         
                            <PathGeometry>
                                <PathGeometry.Figures>
                                    <PathFigureCollection>
                                        <PathFigure IsClosed="true" StartPoint="50,50">
                                            <PathFigure.Segments>
                                                <PathSegmentCollection>
                                                    <BezierSegment Point1="100,180" 
                                                                   Point2="125,100" Point3="150,50"/>                                                
                                                </PathSegmentCollection>
                                            </PathFigure.Segments>
                                        </PathFigure>                                     
                                        <PathFigure IsClosed="true" StartPoint="40,310">
                                            <PathFigure.Segments>
                                                <PathSegmentCollection>
                                                    <BezierSegment Point1="90,180"
                                                                   Point2="115,250" Point3="140,310"/>
                                                </PathSegmentCollection>
                                            </PathFigure.Segments>
                                        </PathFigure>
                                    </PathFigureCollection>
                                </PathGeometry.Figures>
                            </PathGeometry>                  
                        </GeometryGroup>
                    </Path.Data>
                </Path>  

    这张图花了我好久时间呢。希望大家也都会画。尽管作用不大,只是花着玩玩也不错。

    这里写图片描写叙述

    我在图上大概加了一些标注啦。另外RectangleGeometry的Rect属性有2个值,后者是相对于前者添加的长度哦。

    最难的部分是BezierSegment,也就是贝赛斯曲线,当中StartPoint和Point3分别为起点和终点,而Point1和Point2不是路径哟,仅仅是给曲线的一个參考偏移方向。

    详细大家能够上维基百科看看。

    画笔与图像

    画笔想必大家都不陌生,这里系统的介绍一下好了。先来介绍纯色画笔。

    纯色画笔

    最简单的纯色画笔就是已经定义好名字的啦。比方Red和Green这样的,据说一共同拥有256种已命名的,所以基本已经够用啦。XAML解析器会自己主动将这些颜色名称链接到Color结构。

    还有就是传说中的十六进制颜色值,它能够定义精确的24位颜色值。当中有8位用于SolidColorBrush。例如以下代码所看到的的,alpha=”FF”。红色=”55”,绿色=”00”。蓝色=”88”。

    <Rectangle Width="200" Height="100" Fill="#FF550088" />

    另一种称为属性元素语法。

    详细使用方法例如以下,当中Opacity就是透明度咯。

      <Rectangle Width="200" Height="100">
         <Rectangle.Fill>
            <SolidColorBrush Color="Yellow" Opacity="0.3" />
         </Rectangle.Fill>
      </Rectangle>

    渐变画笔

    除了纯色画笔外,还有渐变画笔。

    小时候学PhotoShop的时候最喜欢渐变画笔了。

    LinearGradientBrush会沿着一条称为渐变轴直线来进行渐变以绘制一个区域。我们还是拿Rectangle来做演示样例。

       <Rectangle Width="200" Height="100">
                <Rectangle.Fill>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <GradientStop Color="Green" Offset="0.0" x:Name="GradientStop1"/>
                        <GradientStop Color="Blue" Offset="0.25" x:Name="GradientStop2"/>
                        <GradientStop Color="Wheat"  Offset="0.7" x:Name="GradientStop3"/>
                        <GradientStop Color="Yellow" Offset="0.75" x:Name="GradientStop4"/>
                        <GradientStop Color="Gold" Offset="1.0" x:Name="GradientStop5"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>

    这里写图片描写叙述

    通过改变StartPoint和EndPoint的属性值能够创建各种渐变哦,比方垂直和水平方向的渐变,还能够颠倒渐变方向,甚至还能够加快渐变速度呢。

    直接加入图片

    除了用着两种画笔外,还能够直接将图片加入进来呢。

     <Ellipse Height="100" Width="200">
        <Ellipse.Fill>
            <ImageBrush ImageSource="9327.jpg"/>
        </Ellipse.Fill>
    </Ellipse>

    效果例如以下咯,主要是有一张合适的图片啦。

    这里写图片描写叙述

    既然用到了ImageBrush,那就来看看Image和ImageBrush的差别好了。前者主要用来呈现图像,后者则为其它对象绘制为一个图像。

    Stretch属性

    对于Image,我们能够来拉伸图像。也就是Stretch属性:

    None:图像不经过拉伸。假设源图像比所留给Image的区域大。那么就会被剪切。
    Uniform:依照纵横比来缩放图像。
    UniformToFill:依照纵横比来填满全部区域,这意味着可能会有一部分不可见。
    Fill。由于不保留纵横比而填满屏幕,所以图像部分全部可见,但会产生画面变形(失真)。
    详细效果见下图(来源于网络)。

    这里写图片描写叙述

    Clip属性

    用Clip属性能够对图像进行剪裁,Rect属性在上一篇博客中用过很多次。前2个值为起始点的X轴和Y轴坐标,后2个值为终点的X轴和Y轴坐标。

    <Image Source="9327.jpg">
        <Image.Clip>
            <RectangleGeometry Rect="10,10,100,100"/>
        </Image.Clip>
    </Image>

    Image和ImageBrush能处理的图像格式有例如以下几种:

    JPEG XR
    图标(ICO)
    位图(BMP)
    图像交换格式(GIF)
    联合图像专家组(JPEG)
    可移植网络图像(PNG)
    标记图像文件格式(TIEF)

  • 相关阅读:
    六、运行状态说明
    五、启动、退出动作
    四、健康检查、调度约束
    分布式事务(第08篇)分布式事务解决方法-如何选择各种解决方案
    分布式事务(第07篇)分布式事务解决方法-最大努力交付
    分布式事务(第06篇)分布式事务解决方法-可靠消息最终一致性
    分布式事务(第05篇)分布式事务解决方法-TCC
    分布式事务(第04篇)分布式事务解决方法-3PC
    分布式事务(第03篇)分布式事务解决方法-2PC(两阶段提交)
    分布式事务(第02篇)分布式事务基础理论
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7226966.html
Copyright © 2011-2022 走看看