SilverLight3 cool开发(二) Mac Dock栏
上一篇中的问题至今没有解决,使用SL3创建的新项目都会预览报错,现在是开发环境的问题无疑了.今天在VS2010下使用SL2重做了一遍,结果写的那个手写识别服务无法兼容,没办法了,哪位大哥帮帮小弟?
今天来做一下用SilverLight开发Mac Dock栏,只能用VS2010+SL2了,效果没什么区别.
先贴几张效果图:
第一步:新建项目,这次做的是一个小插件,所以可以不用网站来承载,与上次有所不同
添加New Item(到这里机器又死了,关了重开,公司的电脑配置低啊),SilverLight User Control 2个
,一个用来显示每个小圆UserDockItem,另一个用来承载所有圆UserDock
第二步:定义小圆的功能事件
1.前台画小圆,并且定义小圆的原始大小与鼠标移动事件
| Width="30" Height="30" MouseMove="UserControl_MouseMove" > | 
| <Grid x:Name="LayoutRoot" Background="Transparent"> | 
| <Ellipse Fill="Red"> | 
| </Ellipse> | 
| </Grid> | 
2.后台Coding
| internal UserDock Dock;//引用承载对象 | 
| public UserDockItem() | 
| { | 
| InitializeComponent(); | 
| } | 
| /// <summary> | 
| /// 求出鼠标到指定球的距离 | 
| /// </summary> | 
| /// <param name="mouse">鼠标位置</param> | 
| /// <param name="target">到哪一个球</param> | 
| public double CalculateDistance(MouseEventArgs mouse, UserDockItem target) | 
| { | 
| double mouseX = mouse.GetPosition(target).X - (target.ActualWidth / 2); | 
| double mouseY = mouse.GetPosition(target).Y - (target.ActualHeight / 2); | 
| double d = Math.Sqrt(mouseX*mouseX+mouseY*mouseY); | 
| return d; | 
| } | 
| /// <summary> | 
| /// 改变球大小 | 
| /// </summary> | 
| /// <param name="e"></param> | 
| private void Change(MouseEventArgs e) | 
| { | 
| foreach (var item in Dock.items) | 
| { | 
| double d = CalculateDistance(e, item); | 
| double z = Zoom(d, Dock.Sensitivity, Dock.MaxZoom); | 
| item.Height = z * Dock.Size;//假定是正方型 | 
| item.Width = z * Dock.Size; | 
| } | 
| } | 
| /// <summary> | 
| /// 返回单位放大缩小倍数 | 
| /// </summary> | 
| /// <param name="d">当前距离</param> | 
| /// <param name="s">最大距离</param> | 
| /// <param name="m">最大的倍数</param> | 
| /// <returns></returns> | 
| public double Zoom(double d, double s, double m) | 
| { | 
| double z = m * (d - s) * (d - s) / ((s * s) + 1); | 
| if (z < 1) | 
| return 1; | 
| else | 
| return z; | 
| } | 
| //鼠标移动 | 
| private void UserControl_MouseMove(object sender, MouseEventArgs e) | 
| { | 
| Change(e); | 
| } | 
因为引用了UserDock里面定义的属性,所以当前页面的Dock.items目前还不存在,进入第二步
第二步:UserDock设置
1.前台
只需要将Grid改为StackPanel ,上次提到StackPanel 的作用是更直观的布局,这里改为水平排列
| <StackPanel Orientation="Horizontal" x:Name="LayoutRoot" Background="White"> | 
| </StackPanel> | 
2.后台
因为这是一个小控件,很多属性给调用者去设定,为以后新增功能提供接口
| internal List<SilverDockItem> items = new List<SilverDockItem>();//引用小圆 | 
| public double MaxZoom{ get; set; } //最大放大倍数 | 
| public double Sensitivity { get; set; } //灵敏度 | 
| public double Size { get; set; } //小圆的尺寸,默认为正方形 | 
| public UserDock() | 
| { | 
| InitializeComponent(); | 
| } | 
| //添加小圆方法 | 
| public void AddItem(SilverDockItem item) | 
| { | 
| item.Dock = this; | 
| item.Width = Size; | 
| item.Height = Size; | 
| items.Add(item); | 
| LayoutRoot.Children.Add(item); | 
| } | 
| //删除小圆 | 
| public void RemoveItem(SilverDockItem item) | 
| { | 
| items.Remove(item); | 
| LayoutRoot.Children.Remove(item); | 
| } | 
第三步:调用控件
控件已经初步写好了,现在开始在MainPage.xaml.cs里面调用
| public MainPage() | 
| { | 
| InitializeComponent(); | 
| //添加用户控件 | 
| UserDock D = new UserDock(); | 
| D.Sensitivity = 600;//敏感距离 | 
| D.MaxZoom = 5;//最大倍数 | 
| D.Size = 40;//位置 | 
| LayoutRoot.Children.Add(D); | 
| //添加10个小圆 | 
| for (int i = 1; i <10;i++) | 
| { | 
| SilverDockItem S = new SilverDockItem(); | 
| D.AddItem(S); | 
| } | 
| } | 
总结:这个小实例比较简单,同时也有很多功能未完成.在这里个人认为难点在圆的公式的把握上,需要多次测试才能得到理想的效果.
  
 
                    
                 





 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号