上回说道,ANode的外观绘制,今天继续动画部分。
我对ANode的各个状态做了一个小总结
ANode 的 状态 |
ANode 的 状态 |
1.普通状态(NormalStatus) 2.选中状态(SelectedStatus) 3.编辑状态(EditStatus) 4.拖动状态(DragStatus) |
基本动画 |
针对于这几个状态之间的变换,我采用动画的方式,逐一介绍
在介绍我们设定的各种状态前,让我们看看具体都涉及哪些动画。
动画直接写Xaml
1 <!--边框变为1--> 2 <ThicknessAnimationUsingKeyFrames 3 Storyboard.TargetProperty="(Border.BorderThickness)" 4 Storyboard.TargetName="NodeBorder"> 5 <EasingThicknessKeyFrame KeyTime="0" Value="1"/> 6 </ThicknessAnimationUsingKeyFrames>
ANode边框变小
1 <!--边框阴影变为5--> 2 <DoubleAnimationUsingKeyFrames 3 Storyboard.TargetProperty="(UIElement.Effect) 4 .(DropShadowEffect.BlurRadius)" 5 Storyboard.TargetName="NodeBackground"> 6 <EasingDoubleKeyFrame KeyTime="0" Value="5"/> 7 </DoubleAnimationUsingKeyFrames>
阴影缩小为5
1 <!--输入框隐藏--> 2 <DoubleAnimationUsingKeyFrames 3 Storyboard.TargetProperty="(UIElement.Opacity)" 4 Storyboard.TargetName="NodeTextInput"> 5 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 6 </DoubleAnimationUsingKeyFrames>
输入文本框隐藏
1 <!--创建工具栏隐藏--> 2 <DoubleAnimationUsingKeyFrames 3 Storyboard.TargetProperty="(UIElement.Opacity)" 4 Storyboard.TargetName="NewFriend"> 5 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 6 </DoubleAnimationUsingKeyFrames> 7 <DoubleAnimationUsingKeyFrames 8 Storyboard.TargetProperty="(UIElement.Opacity)" 9 Storyboard.TargetName="NewSubNode"> 10 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 11 </DoubleAnimationUsingKeyFrames>
工具栏隐藏
这里所用的隐藏,并不是设置Visible,而是将透明度变为0,只写一个KeyTime,
即可在任何状态下直接变成你想要的状态。
动画 的 组合 |
大概,需要的动画,就差不多写完了,在不同的状态下,只要改变参数就可以了。
现在将这些动画,分配给各个状态。在我们想要ANode变成什么状态时,就播放相应的动画。
现在就开始设置各个状态的动画面板(StoryBoard)
1.普通状态
,普通状态下,控件边框缩小为1,阴影也缩小为5,隐藏工具栏等
1 <!--正常状态--> 2 <Storyboard x:Key="NormalStatus"> 3 <!--边框变为1--> 4 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="NodeBorder"> 5 <EasingThicknessKeyFrame KeyTime="0" Value="1"/> 6 </ThicknessAnimationUsingKeyFrames> 7 <!--边框阴影变为5--> 8 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" Storyboard.TargetName="NodeBackground"> 9 <EasingDoubleKeyFrame KeyTime="0" Value="5"/> 10 </DoubleAnimationUsingKeyFrames> 11 <!--输入框隐藏--> 12 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 13 Storyboard.TargetName="NodeTextInput"> 14 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 15 </DoubleAnimationUsingKeyFrames> 16 <!--创建工具栏隐藏--> 17 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 18 Storyboard.TargetName="NewFriend"> 19 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 20 </DoubleAnimationUsingKeyFrames> 21 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 22 Storyboard.TargetName="NewSubNode"> 23 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 24 </DoubleAnimationUsingKeyFrames> 25 </Storyboard>
2.选中状态:边框 4 阴影 10 工具栏出现
1 <!--选中状态--> 2 <Storyboard x:Key="SelectedStatus"> 3 <!--边框变为4--> 4 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" 5 Storyboard.TargetName="NodeBorder"> 6 <EasingThicknessKeyFrame KeyTime="0" Value="4"/> 7 </ThicknessAnimationUsingKeyFrames> 8 <!--边框阴影变为10--> 9 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" 10 Storyboard.TargetName="NodeBackground"> 11 <EasingDoubleKeyFrame KeyTime="0" Value="10"/> 12 </DoubleAnimationUsingKeyFrames> 13 <!--输入框隐藏--> 14 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 15 Storyboard.TargetName="NodeTextInput"> 16 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 17 </DoubleAnimationUsingKeyFrames> 18 <!--创建工具栏显现--> 19 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 20 Storyboard.TargetName="NewFriend"> 21 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/> 22 </DoubleAnimationUsingKeyFrames> 23 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 24 Storyboard.TargetName="NewSubNode"> 25 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/> 26 </DoubleAnimationUsingKeyFrames> 27 </Storyboard>
3.编辑状态:边框 4 阴影 10 隐藏工具栏 显示输入框
1 <!--编辑状态--> 2 <Storyboard x:Key="EditStatus"> 3 <!--鼠标变为手--> 4 <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Cursor)" Storyboard.TargetName="ANodeObject"> 5 <DiscreteObjectKeyFrame KeyTime="0"> 6 <DiscreteObjectKeyFrame.Value> 7 <Cursor>Hand</Cursor> 8 </DiscreteObjectKeyFrame.Value> 9 </DiscreteObjectKeyFrame> 10 </ObjectAnimationUsingKeyFrames> 11 <!--边框变为4--> 12 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" 13 Storyboard.TargetName="NodeBorder"> 14 <EasingThicknessKeyFrame KeyTime="0" Value="4"/> 15 </ThicknessAnimationUsingKeyFrames> 16 <!--边框阴影变为10--> 17 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" 18 Storyboard.TargetName="NodeBackground"> 19 <EasingDoubleKeyFrame KeyTime="0" Value="10"/> 20 </DoubleAnimationUsingKeyFrames> 21 <!--输入框显现--> 22 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 23 Storyboard.TargetName="NodeTextInput"> 24 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/> 25 </DoubleAnimationUsingKeyFrames> 26 <!--创建工具栏隐藏--> 27 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 28 Storyboard.TargetName="NewFriend"> 29 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 30 </DoubleAnimationUsingKeyFrames> 31 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 32 Storyboard.TargetName="NewSubNode"> 33 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 34 </DoubleAnimationUsingKeyFrames> 35 </Storyboard>
4.拖动状态:比选中状态少一个工具栏而已
1 <!--拖动状态--> 2 <Storyboard x:Key="DragStatus"> 3 <!--鼠标变为移动--> 4 <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Cursor)" Storyboard.TargetName="ANodeObject"> 5 <DiscreteObjectKeyFrame KeyTime="0"> 6 <DiscreteObjectKeyFrame.Value> 7 <Cursor>SizeAll</Cursor> 8 </DiscreteObjectKeyFrame.Value> 9 </DiscreteObjectKeyFrame> 10 </ObjectAnimationUsingKeyFrames> 11 <!--边框变为4--> 12 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="NodeBorder"> 13 <EasingThicknessKeyFrame KeyTime="0" Value="4"/> 14 </ThicknessAnimationUsingKeyFrames> 15 <!--边框阴影变为10--> 16 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" Storyboard.TargetName="NodeBackground"> 17 <EasingDoubleKeyFrame KeyTime="0" Value="10"/> 18 </DoubleAnimationUsingKeyFrames> 19 <!--输入框隐藏--> 20 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 21 Storyboard.TargetName="NodeTextInput"> 22 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 23 </DoubleAnimationUsingKeyFrames> 24 <!--创建工具栏隐藏--> 25 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 26 Storyboard.TargetName="NewFriend"> 27 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 28 </DoubleAnimationUsingKeyFrames> 29 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 30 Storyboard.TargetName="NewSubNode"> 31 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 32 </DoubleAnimationUsingKeyFrames> 33 </Storyboard>
这样,状态动画就做完了,放在<UserControl.Resources>中,作为动画资源,等待调用。
下面,这些状态的触发,可以在Xaml中设置,也可以在代码中启动,将不需要在代码中启动
的动画添加到触发器<UserControl.Triggers>当中。
1 <UserControl.Triggers> 2 <!--启动时设置为正常状态--> 3 <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 4 <BeginStoryboard x:Name="OnLoaded_BeginStoryboard" 5 Storyboard="{StaticResource NormalStatus}"/> 6 </EventTrigger> 7 <!--鼠标在NodeText上抬起时设置为编辑状态--> 8 <EventTrigger RoutedEvent="Mouse.PreviewMouseUp" SourceName="NodeTextInput"> 9 <BeginStoryboard x:Name="EditStatus_BeginStoryboard" 10 Storyboard="{StaticResource EditStatus}"/> 11 </EventTrigger> 12 <!--NodeTextInput失去焦点时,变成普通状态--> 13 <EventTrigger RoutedEvent="Keyboard.LostKeyboardFocus" SourceName="NodeTextInput"> 14 <BeginStoryboard Storyboard="{StaticResource NormalStatus}"/> 15 </EventTrigger> 16 </UserControl.Triggers>
其实最后一个失去焦点的动画,可以不写在Xaml中,因为,ANode失去焦点有几种情况,
主要发生在UI的事件中。
完整 的 代码 |
那么,目前的ANode Xaml部分就介绍完了,如果后续有需要,可以继续在这个结构基础上
添加即可。
贴一个完整的代码。
1 <UserControl x:Class="ANode" x:Name="ANodeObject" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Cursor="Hand" 6 > 7 <UserControl.Resources> 8 <DrawingBrush x:Key="NewFriendSource" Stretch="None"> 9 <DrawingBrush.Drawing> 10 <DrawingGroup> 11 <DrawingGroup.Children> 12 <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 17.5914,16.3333L 2.25811,16.3333C 1.56327,16.3333 0.999996,15.6636 0.999996,14.8374L 0.999996,2.49591C 0.999996,1.66974 1.56327,1 2.25811,1L 17.5914,1L 24,8.71332L 17.5914,16.3333 Z "> 13 <GeometryDrawing.Pen> 14 <Pen Thickness="1" LineJoin="Round" Brush="#FFBCBCB3"/> 15 </GeometryDrawing.Pen> 16 </GeometryDrawing> 17 <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 6.66936,7.17059L 11.0569,7.17059C 12.1615,7.17059 13.0569,8.06598 13.0569,9.17059L 13.0569,12.1517C 13.0569,13.2563 12.1615,14.1517 11.0569,14.1517L 6.66936,14.1517C 5.56479,14.1517 4.66936,13.2563 4.66936,12.1517L 4.66936,9.17059C 4.66936,8.06598 5.56479,7.17059 6.66936,7.17059 Z "> 18 <GeometryDrawing.Pen> 19 <Pen LineJoin="Round" Brush="#FFA9A9A6"/> 20 </GeometryDrawing.Pen> 21 </GeometryDrawing> 22 <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 8.02445,7.17059L 4.4598,2.93213"> 23 <GeometryDrawing.Pen> 24 <Pen LineJoin="Round" Brush="#FF000000"/> 25 </GeometryDrawing.Pen> 26 </GeometryDrawing> 27 <GeometryDrawing Brush="#FFFFC800" Geometry="F1 M 17.8081,5.81027L 15.7027,6.15466L 17.2235,7.95245L 15.9447,8.9368L 14.7892,6.79465L 13.6794,8.9368L 12.4006,7.95245L 13.8918,6.1449L 11.7795,5.81027L 12.3001,4.24701L 14.248,5.10681L 13.8621,2.68375L 15.6159,2.68375L 15.3396,5.11658L 17.2738,4.24701L 17.8081,5.81027 Z "/> 28 </DrawingGroup.Children> 29 </DrawingGroup> 30 </DrawingBrush.Drawing> 31 </DrawingBrush> 32 <DrawingBrush x:Key="NewSubSource" Stretch="None"> 33 <DrawingBrush.Drawing> 34 <DrawingGroup> 35 <DrawingGroup.Children> 36 <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 2.40969,1.00002L 19.5903,1.00002C 20.3689,1.00002 21,1.63118 21,2.40975L 21,14.0399C 21,14.8184 20.3689,15.4496 19.5903,15.4496L 15.185,15.4496L 11.2203,19.4144L 7.34276,15.4496L 2.40969,15.4496C 1.63113,15.4496 0.999995,14.8184 0.999995,14.0399L 0.999995,2.40975C 0.999995,1.63118 1.63113,1.00002 2.40969,1.00002 Z "> 37 <GeometryDrawing.Pen> 38 <Pen Thickness="1" LineJoin="Round" Brush="#FFBCBCB3"/> 39 </GeometryDrawing.Pen> 40 </GeometryDrawing> 41 <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 7.78709,7.44625L 13.185,7.44625C 14.2896,7.44625 15.185,8.34169 15.185,9.44625L 15.185,12.0249C 15.185,13.1295 14.2896,14.0249 13.185,14.0249L 7.78709,14.0249C 6.68251,14.0249 5.78708,13.1295 5.78708,12.0249L 5.78708,9.44625C 5.78708,8.34169 6.68251,7.44625 7.78709,7.44625 Z "> 42 <GeometryDrawing.Pen> 43 <Pen LineJoin="Round" Brush="#FFA9A9A6"/> 44 </GeometryDrawing.Pen> 45 </GeometryDrawing> 46 <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 10.2511,7.44619L 10.2471,2.58602"> 47 <GeometryDrawing.Pen> 48 <Pen LineJoin="Round" Brush="#FF000000"/> 49 </GeometryDrawing.Pen> 50 </GeometryDrawing> 51 <GeometryDrawing Brush="#FFFFC800" Geometry="F1 M 19.6998,6.25523L 17.5943,6.59962L 19.1152,8.39738L 17.8364,9.38176L 16.6809,7.23961L 15.5711,9.38176L 14.2923,8.39738L 15.7835,6.58986L 13.6712,6.25523L 14.1918,4.69194L 16.1397,5.55177L 15.7538,3.12871L 17.5076,3.12871L 17.2313,5.56154L 19.1655,4.69194L 19.6998,6.25523 Z "/> 52 </DrawingGroup.Children> 53 </DrawingGroup> 54 </DrawingBrush.Drawing> 55 </DrawingBrush> 56 <!--正常状态--> 57 <Storyboard x:Key="NormalStatus"> 58 <!--边框变为1--> 59 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="NodeBorder"> 60 <EasingThicknessKeyFrame KeyTime="0" Value="1"/> 61 </ThicknessAnimationUsingKeyFrames> 62 <!--边框阴影变为5--> 63 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" Storyboard.TargetName="NodeBackground"> 64 <EasingDoubleKeyFrame KeyTime="0" Value="5"/> 65 </DoubleAnimationUsingKeyFrames> 66 <!--输入框隐藏--> 67 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 68 Storyboard.TargetName="NodeTextInput"> 69 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 70 </DoubleAnimationUsingKeyFrames> 71 <!--创建工具栏隐藏--> 72 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 73 Storyboard.TargetName="NewFriend"> 74 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 75 </DoubleAnimationUsingKeyFrames> 76 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 77 Storyboard.TargetName="NewSubNode"> 78 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 79 </DoubleAnimationUsingKeyFrames> 80 </Storyboard> 81 <!--选中状态--> 82 <Storyboard x:Key="SelectedStatus"> 83 <!--边框变为4--> 84 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" 85 Storyboard.TargetName="NodeBorder"> 86 <EasingThicknessKeyFrame KeyTime="0" Value="4"/> 87 </ThicknessAnimationUsingKeyFrames> 88 <!--边框阴影变为10--> 89 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" 90 Storyboard.TargetName="NodeBackground"> 91 <EasingDoubleKeyFrame KeyTime="0" Value="10"/> 92 </DoubleAnimationUsingKeyFrames> 93 <!--输入框隐藏--> 94 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 95 Storyboard.TargetName="NodeTextInput"> 96 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 97 </DoubleAnimationUsingKeyFrames> 98 <!--创建工具栏显现--> 99 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 100 Storyboard.TargetName="NewFriend"> 101 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/> 102 </DoubleAnimationUsingKeyFrames> 103 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 104 Storyboard.TargetName="NewSubNode"> 105 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/> 106 </DoubleAnimationUsingKeyFrames> 107 </Storyboard> 108 <!--编辑状态--> 109 <Storyboard x:Key="EditStatus"> 110 <!--鼠标变为手--> 111 <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Cursor)" Storyboard.TargetName="ANodeObject"> 112 <DiscreteObjectKeyFrame KeyTime="0"> 113 <DiscreteObjectKeyFrame.Value> 114 <Cursor>Hand</Cursor> 115 </DiscreteObjectKeyFrame.Value> 116 </DiscreteObjectKeyFrame> 117 </ObjectAnimationUsingKeyFrames> 118 <!--边框变为4--> 119 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" 120 Storyboard.TargetName="NodeBorder"> 121 <EasingThicknessKeyFrame KeyTime="0" Value="4"/> 122 </ThicknessAnimationUsingKeyFrames> 123 <!--边框阴影变为10--> 124 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" 125 Storyboard.TargetName="NodeBackground"> 126 <EasingDoubleKeyFrame KeyTime="0" Value="10"/> 127 </DoubleAnimationUsingKeyFrames> 128 <!--输入框显现--> 129 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 130 Storyboard.TargetName="NodeTextInput"> 131 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/> 132 </DoubleAnimationUsingKeyFrames> 133 <!--创建工具栏隐藏--> 134 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 135 Storyboard.TargetName="NewFriend"> 136 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 137 </DoubleAnimationUsingKeyFrames> 138 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 139 Storyboard.TargetName="NewSubNode"> 140 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 141 </DoubleAnimationUsingKeyFrames> 142 </Storyboard> 143 <!--拖动状态--> 144 <Storyboard x:Key="DragStatus"> 145 <!--鼠标变为移动--> 146 <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Cursor)" Storyboard.TargetName="ANodeObject"> 147 <DiscreteObjectKeyFrame KeyTime="0"> 148 <DiscreteObjectKeyFrame.Value> 149 <Cursor>SizeAll</Cursor> 150 </DiscreteObjectKeyFrame.Value> 151 </DiscreteObjectKeyFrame> 152 </ObjectAnimationUsingKeyFrames> 153 <!--边框变为4--> 154 <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="NodeBorder"> 155 <EasingThicknessKeyFrame KeyTime="0" Value="4"/> 156 </ThicknessAnimationUsingKeyFrames> 157 <!--边框阴影变为10--> 158 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" Storyboard.TargetName="NodeBackground"> 159 <EasingDoubleKeyFrame KeyTime="0" Value="10"/> 160 </DoubleAnimationUsingKeyFrames> 161 <!--输入框隐藏--> 162 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 163 Storyboard.TargetName="NodeTextInput"> 164 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 165 </DoubleAnimationUsingKeyFrames> 166 <!--创建工具栏隐藏--> 167 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 168 Storyboard.TargetName="NewFriend"> 169 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 170 </DoubleAnimationUsingKeyFrames> 171 <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 172 Storyboard.TargetName="NewSubNode"> 173 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/> 174 </DoubleAnimationUsingKeyFrames> 175 </Storyboard> 176 </UserControl.Resources> 177 <UserControl.Triggers> 178 <!--启动时设置为正常状态--> 179 <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 180 <BeginStoryboard x:Name="OnLoaded_BeginStoryboard" 181 Storyboard="{StaticResource NormalStatus}"/> 182 </EventTrigger> 183 <!--鼠标在NodeText上抬起时设置为编辑状态--> 184 <EventTrigger RoutedEvent="Mouse.PreviewMouseUp" SourceName="NodeTextInput"> 185 <BeginStoryboard x:Name="EditStatus_BeginStoryboard" 186 Storyboard="{StaticResource EditStatus}"/> 187 </EventTrigger> 188 <!--NodeTextInput失去焦点时,变成普通状态--> 189 <EventTrigger RoutedEvent="Keyboard.LostKeyboardFocus" SourceName="NodeTextInput"> 190 <BeginStoryboard Storyboard="{StaticResource NormalStatus}"/> 191 </EventTrigger> 192 </UserControl.Triggers> 193 <Grid x:Name="NodeGrid" Background="Transparent" > 194 <Grid.ColumnDefinitions> 195 <ColumnDefinition Width="10"/> 196 <ColumnDefinition Width="*"/> 197 <ColumnDefinition Width="10"/> 198 </Grid.ColumnDefinitions> 199 <Grid.RowDefinitions> 200 <RowDefinition Height="10"/> 201 <RowDefinition Height="*"/> 202 <RowDefinition Height="10"/> 203 </Grid.RowDefinitions> 204 <Grid Grid.Column="1" Grid.Row="1"> 205 <Border x:Name="NodeBackground" Background="#FF6C6262" CornerRadius="12" 206 BorderThickness="1" BorderBrush="#FF6C6262" > 207 <Border.Effect> 208 <DropShadowEffect RenderingBias="Quality" ShadowDepth="0"/> 209 </Border.Effect> 210 </Border> 211 <Grid> 212 <Grid.RowDefinitions> 213 <RowDefinition Height="50*"/> 214 <RowDefinition Height="50*"/> 215 </Grid.RowDefinitions> 216 <Border Grid.Row="0" Margin="3,3,3,0" CornerRadius="10" Opacity="0.2"> 217 <Border.Background> 218 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 219 <GradientStop Color="#7FFFFFFF" Offset="1"/> 220 <GradientStop Color="White"/> 221 </LinearGradientBrush> 222 </Border.Background> 223 </Border> 224 </Grid> 225 <Border x:Name="NodeBorder" 226 CornerRadius="12" 227 BorderThickness="1" 228 Opacity="0.6" 229 BorderBrush="#4CFFFFFF" 230 > 231 <Border.Background> 232 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 233 <GradientStop Color="#99FFFFFF" Offset="1"/> 234 <GradientStop Color="#4CFFFFFF"/> 235 <GradientStop Color="#58FFFFFF" Offset="0.5"/> 236 </LinearGradientBrush> 237 </Border.Background> 238 </Border> 239 <Border> 240 <TextBlock x:Name="NodeText" 241 Text="{Binding Text, Mode=OneWay}" 242 FontSize="12" 243 HorizontalAlignment="Center" VerticalAlignment="Center" 244 TextWrapping="WrapWithOverflow" 245 Cursor="IBeam" 246 Margin="10,10,10,20" 247 MinWidth="46" 248 FontWeight="Bold" /> 249 </Border> 250 <TextBox x:Name="NodeTextInput" 251 Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 252 FontSize="12" 253 Focusable="True" 254 HorizontalAlignment="Center" VerticalAlignment="Bottom" 255 AcceptsReturn="True" 256 Margin="10,0,10,20" 257 MinWidth="50" 258 BorderThickness="0" 259 FontStretch="UltraExpanded" 260 Padding="0" 261 FontWeight="Bold" 262 /> 263 </Grid> 264 <Grid x:Name="ToolsPanel" Grid.Column="2" Grid.Row="1" > 265 <Rectangle Name="NewFriend" Fill="{DynamicResource NewFriendSource}" Margin="-10,0" Width="25" UseLayoutRounding="False"/> 266 </Grid> 267 <Canvas x:Name="ToolsPanel1" Grid.Column="3" Grid.Row="3"> 268 <Rectangle Name="NewSubNode" Fill="{DynamicResource NewSubSource}" Width="26" Height="21" Margin="-10,-15,0,0"></Rectangle> 269 </Canvas> 270 </Grid> 271 </UserControl> 272
下期预告,代码中的动画触发和几个基本属性。