zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    201771010117马兴德 实验二 Java基本程序设计(1)
    马兴德201771010117《面向对象程序设计(java)》第一周学习总结
    李晓菁201771010114《面向对象程序设计(Java)》第一周学习总结
    狄慧201771010104《面向对象程序设计(java)》第二周学习总结
    狄慧201771010104《面向对象程序设计(java)》第一周学习总结
    获奖感言
    王之泰201771010131《面向对象程序设计(java)》第十周学习总结
    王之泰201771010131《面向对象程序设计(java)》第九周学习总结
    王之泰201771010131《面向对象程序设计(java)》第八周学习总结
    王之泰201771010131《面向对象程序设计(java)》第七周学习总结
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3201144.html
Copyright © 2011-2022 走看看