之前用坐标画多边形的方法,绘制五角星。今天调试时发现当时写的时候有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