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-22:WPF绘制五角星改进版(增加半个五角星的绘制)-修改bug)