SilverLight3 cool开发(二) Mac Dock栏

      上一篇中的问题至今没有解决,使用SL3创建的新项目都会预览报错,现在是开发环境的问题无疑了.今天在VS2010下使用SL2重做了一遍,结果写的那个手写识别服务无法兼容,没办法了,哪位大哥帮帮小弟?

     今天来做一下用SilverLight开发Mac Dock栏,只能用VS2010+SL2了,效果没什么区别.

先贴几张效果图:

image

image

第一步:新建项目,这次做的是一个小插件,所以可以不用网站来承载,与上次有所不同

image

添加New Item(到这里机器又死了,关了重开,公司的电脑配置低啊),SilverLight User Control 2个

,一个用来显示每个小圆UserDockItem,另一个用来承载所有圆UserDock

image

 

第二步:定义小圆的功能事件

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);
        } 
    }
 
 
总结:这个小实例比较简单,同时也有很多功能未完成.在这里个人认为难点在圆的公式的把握上,需要多次测试才能得到理想的效果.

 

源码下载save

posted @ 2009-08-27 17:39  -飛天蟲  阅读(547)  评论(1编辑  收藏  举报