上回说道,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
下期预告,代码中的动画触发和几个基本属性。