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

你可能感兴趣的:(WPF)