本文共 7000 字,大约阅读时间需要 23 分钟。
最近看到一个比较漂亮的UI主界面,该UI是用左边的页签进行导航,比较有特色,就想着尝试用WPF来实现一下。经过一番尝试,基本上将UI设计图的效果用WPF程序进行了实现。下面介绍一下主要的思路:
该UI的PSD设计图效果如下:
UI结构分析:先可以把UI分成上下两个区域,上面是一个区域放置一些appName,用户信息和配置按钮等,下面的再分成竖向的页签导航区域和内容区。但从WPF程序实现上来说,可以有多种区域划分方法,每个人的划分方法不同。
内容区域的图片不做切图,它会动态根据左边的导航菜单的配置动态进行加载内容。本文只实现主界面UI框架。在Photoshop中可以在图片所在图层进行重命名,例如A的图层有一个按钮图标,可以将其命名为A.png(注意之前需要勾选Photoshop的生成【图片资源】项目),那么就可以在PSD文件同级目录中生成一个同名的文件夹,里面就有A.png的图标了!
PSD设计的UI需要转换成WPF程序,必须要将其UI结构用WPF的布局进行重新梳理,我的布局划分(主要是Grid)代码如下所示:
111 12 35313 35214 1715 16 18 21 2219 20 23 52 5324 26 2725 28 5129 3230 31 33 3734 35 36 38 39 40 41 42 43 44
45
46 47 48
49 50
54 333 33455 33256 108 10957 59 6058 61 62 106 10763 65 6664
67 69 7068
71 73 7472
75 77 7876
79 81 8280
83 85 8684
87 89 9088
91 93 9492
95 97 9896
99 101 102100
103 105104
110 164 165111 113 114112 115 116 160 161 162 163117 119 120118
121 123 124122
125 127 128126
129 131 132130
133 135 136134
137 139 140138
141 143 144142
145 147 148146
149 151 152150
153 155 156154
157 159158
166 219 220167 169 170168 171 172 216 217 218173 175 176174
177 179 180178
181 183 184182
185 187 188186
189 191 192190
193 195 196194
197 199 200198
201 203 204202
205 207 208206
209 211 212210
213 215214
221 274 275222 224 225223 226 227 271 272 273228 230 231229
232 234 235233
236 238 239237
240 242 243241
244 246 247245
248 250 251249
252 254 255253
256 258 259257
260 262 263261
264 266 267265
268 270269
276 329 330 331277 279 280278 281 282 326 327 328283 285 286284
287 289 290288
291 293 294292
295 297 298296
299 301 302300
303 305 306304
307 309 310308
311 313 314312
315 317 318316
319 321 322320
323 325324
335 336 349 350 351337 341 342 343 344 345 348338 340339
主界面中用 AllowsTransparency="True" WindowStyle="None" Background="{x:Null}" 对窗体的边框进行隐藏。坐标的页签是tabControl控件,但是必须要重新定义其Style样式:Style="{DynamicResource TabItemStyle},其中TabItemStyle的代码如下:
14 5 6 40 49 50 5551 52 53 54 56 6157 58 59 60 62 63 64 65 111 112 113 114 115 116 125 126117 124118 123119 120 121 122 127 151 152 153 154 155128 129 132130 131 133 149134 137135 136 138 139 148140 147141 146142 143 144 145 150
UI界面有了,还必须附加一些业务逻辑:
1)窗体拖动;
1 private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)2 {3 this.DragMove();4 }
2)单击页签菜单项目,进行导航到相应的页面;
1 private void Label_MouseLeftButtonDown_2(object sender, MouseButtonEventArgs e)2 {3 this.pageContainer.Source = new Uri("pages/Page_Chart2.xaml", UriKind.RelativeOrAbsolute);4 }
在主界面中有一个名为pageContainer的Frame控件,它能加载Page类型的界面(注意不是window).详细页面的正太分布图形用的Oxyplot控件。
3)坐标的页签菜单栏可以隐藏和显示
1 private bool __isLeftHide = false; 2 private void spliter_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 3 { 4 //显示和隐藏 5 __isLeftHide =! __isLeftHide; 6 if (__isLeftHide) 7 { 8 this.gridForm.ColumnDefinitions[0].Width = new GridLength(1d); 9 }10 else11 {12 this.gridForm.ColumnDefinitions[0].Width = new GridLength(200d);13 }14 15 }
由于Grid没有visiable属性,我这里获取页签所在的Grid列,然后设置其width属性为1,将其隐藏。
最终的效果截图如下(感谢园友斧正:下图的正太分布是正态分布哈!):
左边菜单的颜色,想着不选中显示RGB(0,209,229),选中显示RGB(51,51,51)或者黑色。但尝试了一些方法还未实现。若有园友知道思路的话,欢迎指教!
此代码进行开源,代码托管到GitHub上,
-----------------------------------------------------------------------------------------------------------------
上面提到字体无法变更的问题,经过查阅资料已经解决,这里主要用到触发器设置中的TargetName属性,将设置的值应用到名为TargetName设置的控件对应属性上:
1
另外将日期控件进行了样式完善,这里对TextBox控件利用自定义样式将其设置为具有可以下拉选择日期的功能。
转载地址:http://cmiql.baihongyu.com/