`
he91_com
  • 浏览: 378933 次
文章分类
社区版块
存档分类
最新评论

WPF-22:WPF绘制五角星改进版(增加半个五角星的绘制)-修改bug

 
阅读更多
之前用坐标画多边形的方法,绘制五角星。今天调试时发现当时写的时候有bug,修改一下。
原文:http://blog.csdn.net/yysyangyangyangshan/article/details/9313421,当时没测试绑定的问题,一测试发现绑定有问题。原来是多颗五角星控件中,依赖属性的typeof写错了类。
SelectCount和ItemsCount的typeof(FivePointStar)应该为typeof(FivePointStarGroup)才对,顺便将属性的赋值里的代码改为在回调里调用。
修改后如下:
    /// <summary>
    /// FivePointStarGroup.xaml 的交互逻辑
    /// </summary>
    public partial class FivePointStarGroup : UserControl
    {
        //默认值
        private static double radius = 20;


        private static double itemsCount = 5;


        private static double selectCount = 5;


        private static Brush selectBackground = new SolidColorBrush(Colors.YellowGreen);


        private static Brush unselectBackgroud = new SolidColorBrush(Colors.DarkGray);


        private static event DependencyPropertyChangedEventHandler PropertyChangedEvent;


        private static ObservableCollection<FivePointStarModel> data = new ObservableCollection<FivePointStarModel>();


        public FivePointStarGroup()
        {
            InitializeComponent();


            this.Loaded += new RoutedEventHandler(FivePointStarGroup_Loaded);


            PropertyChangedEvent -= new DependencyPropertyChangedEventHandler(FivePointStarGroup_PropertyChangedEvent);


            PropertyChangedEvent += new DependencyPropertyChangedEventHandler(FivePointStarGroup_PropertyChangedEvent);


            this.lsbGroups.ItemsSource = data;
        }


          /// <summary>
        /// 五角星半径
        /// </summary>
        public double Radius
        {
            get 
            {
               object result = GetValue(RadiusProperty);


                if(result==null)
                {
                    return radius;
                }


                return (double)result;
            }


            set { SetValue(RadiusProperty, value);}
        }


        public static  DependencyProperty RadiusProperty =
           DependencyProperty.Register("Radius", typeof(double),
           typeof(FivePointStarGroup), new UIPropertyMetadata(), new ValidateValueCallback(PaintRadiusElementControls));


        public static bool PaintRadiusElementControls(object value)
        {
            if (PropertyChangedEvent != null)
            {
                PropertyChangedEvent(1, new DependencyPropertyChangedEventArgs(SelectCountProperty, null, value));
            }


            return true;
        }


        /// <summary>
        /// 五角星个数
        /// </summary>
        public double ItemsCount
        {
            get
            {
                object result = GetValue(ItemsCountProperty);


                if (result == null || Convert.ToDouble(result )<=0)
                {
                    return  itemsCount;
                }


                return (double)result;
            }


            set { SetValue(ItemsCountProperty, value); }
        }


        public static  DependencyProperty ItemsCountProperty =
           DependencyProperty.Register("ItemsCount", typeof(double),
           typeof(FivePointStarGroup), new UIPropertyMetadata(), new ValidateValueCallback(PaintItemCountElementControls));


        public static bool PaintItemCountElementControls(object value)
        {
            if (PropertyChangedEvent != null)
            {
                PropertyChangedEvent(2, new DependencyPropertyChangedEventArgs(SelectCountProperty, null, value));
            }


            return true;
        }


        /// <summary>
        /// 选中的五角星个数
        /// </summary>
        public double SelectCount
        {
            get
            {
                object result = GetValue(SelectCountProperty);


                if (result == null || Convert.ToDouble(result) <= 0)
                {
                    return selectCount;
                }


                return (double)result;
            }


            set { SetValue(SelectCountProperty, value);}
        }


        public static  DependencyProperty SelectCountProperty =
           DependencyProperty.Register("SelectCount", typeof(double),
           typeof(FivePointStarGroup), new UIPropertyMetadata(), new ValidateValueCallback(PaintSelectCountElementControls));


        public static bool PaintSelectCountElementControls(object value)
        {
            if (PropertyChangedEvent != null)
            {
                PropertyChangedEvent(3, new DependencyPropertyChangedEventArgs(SelectCountProperty, null, value));
            }


            return true;
        }
        /// <summary>
        /// 鼠标点击选中事件
        /// </summary>
        public event RoutedEventHandler SelectCountChangeEvent
        {
            add { AddHandler(SelectCountChangePropertyEvent, value); }


            remove { RemoveHandler(SelectCountChangePropertyEvent, value); }
        }


        public static RoutedEvent SelectCountChangePropertyEvent =
          EventManager.RegisterRoutedEvent("SelectCountChangeEvent",
          RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Control));


        /// <summary>
        /// 选中颜色
        /// </summary>
        public Brush SelectBackground
        {
            get
            {
                object result = GetValue(SelectBackgroundProperty);


                if (result == null)
                {
                    return selectBackground;
                }


                return (Brush)result;
            }


            set {  SetValue(SelectBackgroundProperty, value);  }
        }


        public static  DependencyProperty SelectBackgroundProperty =
           DependencyProperty.Register("SelectBackground", typeof(Brush),
           typeof(FivePointStarGroup), new UIPropertyMetadata(), new ValidateValueCallback(PaintSelectGroundElementControls));


        public static bool PaintSelectGroundElementControls(object value)
        {
            if (PropertyChangedEvent != null)
            {
                PropertyChangedEvent(4, new DependencyPropertyChangedEventArgs(SelectCountProperty, null, value));
            }


            return true;
        }


        /// <summary>
        /// 未选中颜色
        /// </summary>
        public Brush UnSelectBackground
        {
            get
            {
                object result = GetValue(UnSelectBackgroundProperty);


                if (result == null)
                {
                    return unselectBackgroud;
                }


                return (Brush)result;
            }


            set  {SetValue(UnSelectBackgroundProperty, value); }
        }


        public static  DependencyProperty UnSelectBackgroundProperty =
           DependencyProperty.Register("UnSelectBackground", typeof(Brush),
           typeof(FivePointStarGroup), new UIPropertyMetadata(), new ValidateValueCallback(PaintUnSelectGroundElementControls));


        public static bool PaintUnSelectGroundElementControls(object value)
        {
            if (PropertyChangedEvent != null)
            {
                PropertyChangedEvent(5, new DependencyPropertyChangedEventArgs(SelectCountProperty, null, value));
            }


            return true;
        }


        /// <summary>
        /// 回调时绘图事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void FivePointStarGroup_PropertyChangedEvent(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (sender == null || e == null || e.NewValue == null)
            {
                return;
            }


            int flag = Convert.ToInt32(sender);


            switch (flag)
            {
                case 1:


                    InitialData(Convert.ToDouble(e.NewValue), this.ItemsCount, this.SelectCount, this.SelectBackground, this.UnSelectBackground);


                    break;


                case 2:


                    InitialData(this.Radius, Convert.ToDouble(e.NewValue), this.SelectCount, this.SelectBackground, this.UnSelectBackground);


                    break;


                case 3:


                    InitialData(this.Radius, this.ItemsCount, Convert.ToDouble(e.NewValue), this.SelectBackground, this.UnSelectBackground);


                    break;


                case 4:


                    InitialData(this.Radius, this.ItemsCount, this.SelectCount, e.NewValue as Brush, this.UnSelectBackground);


                    break;


                case 5:


                    InitialData(this.Radius, this.ItemsCount, this.SelectCount, this.SelectBackground, e.NewValue as Brush);


                    break;
            }


            InvalidateVisual();
        }


        void FivePointStarGroup_Loaded(object sender, RoutedEventArgs e)
        {
            InitialData(this.Radius,this.ItemsCount,this.SelectCount,this.SelectBackground,this.UnSelectBackground);
        }
        /// <summary>
        /// 绘图
        /// </summary>
        /// <param name="r"></param>
        /// <param name="itemcount"></param>
        /// <param name="selectcount"></param>
        /// <param name="selectbackground"></param>
        /// <param name="unselectbackground"></param>
        private static  void InitialData( double r,double itemcount,double selectcount,Brush selectbackground,Brush unselectbackground)
        {
            data.Clear();


            int count = Convert.ToInt32(itemcount);


            if (count <= 0)
            {
                count = Convert.ToInt32(itemsCount);
            }


            for (int i = 0; i < count; i++)
            {
                FivePointStarModel item = new FivePointStarModel();


                item.ID = i + 1;


                item.Radius = r;


                item.SelectBackground = selectbackground;


                item.UnselectBackgroud = unselectbackground;


                item.Margins = new Thickness(r, 0, r, 0);


                //在此设置星形显示的颜色
                if ((i + 1) > selectcount && ((i + 1 - selectcount) > 0) &&
                    (i + 1 - selectcount) < 1)
                {
                    item.CurrentValue = 0.5;
                }
                else if ((i + 1) > selectcount)
                {
                    item.CurrentValue = 0;
                }
                else
                {
                    item.CurrentValue = 1;
                }


                data.Add(item);
            }
        }


        /// <summary>
        /// 鼠标选中五角星
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FivePointStar_MouseDown(object sender, MouseButtonEventArgs e)
        {
            FivePointStar m = sender as FivePointStar;


            if (m == null)
            {
                return;
            }


            int index = Convert.ToInt32(m.Tag);


            this.SelectCount = index;


            RaiseEvent(new RoutedEventArgs(SelectCountChangePropertyEvent, sender)); 
        }
    }
修改后工程下载(包括了绑定测试):http://download.csdn.net/detail/yysyangyangyangshan/5782113
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics