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

  1. 【WPF】WPF截屏

    原文:[WPF]WPF截屏 引言 .NET的截图控件在网上流传得不多啊,难得发现一个精品截图控件( 传送门),但是无奈是winform的.后来又找到一个周银辉做的WPF截图(继续传送门),发现截屏是实 ...

  2. 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例

    原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例       用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...

  3. 基于托管的C++来使用WPF - Using WPF with Managed C++

    基于托管的C++来使用WPF - Using WPF with Managed C++ Posted by Zeeshan Amjad This article was originally publ ...

  4. 双缓冲绘图和窗口控件的绘制——ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 .

    双缓冲绘图和窗口控件的绘制 ---ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 cheungmine 我们通常使用ATL COM组件,生成一个带窗口的ActiveX控件,然后 ...

  5. 利用IOS画图功能画出五角星,并且可以调整五角星的填充范围

    我们要花的为一个黄色的五角星并且其中的填充黄色能够任意调整,比如只填满半个五角星,或者只填满一个角等等. 首先要重写DrawRect 方法,然后在这里实现我们的画图代码. - (void)drawRe ...

  6. iOS --SQL的增加、删除、查找、修改

    iOS对于数据库的操作:增加.删除.查找.修改 首先需要创建一个数据库:本程序的数据库是在火狐浏览器里的插件里写的微量型数据库 火狐找查找SQLite Manager的步骤: 第一步:在工具栏找到附加 ...

  7. MySql增加字段、删除字段、修改字段

    MySql增加字段.删除字段.修改字段名称.修改字段类型   1.增加一个字段 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; / ...

  8. MongoDB增加用户、删除用户、修改用户读写权限及只读权限(注:转载于http://www.2cto.com/database/201203/125025.html)

    MongoDB  增加用户 删除用户  修改用户  读写权限 只读权限,   MongoDB用户权限分配的操作是针对某个库来说的.--这句话很重要.   1. 进入ljc 数据库:       use ...

  9. 22 WPF列表,树,网格

    ListView ListView从ListBox派生,只增加了View属性.如果你没有设置View属性,ListView行为正如ListBox. 从技术上,View属性指向任何ViewBase派生类 ...

随机推荐

  1. MSSQL 如何删除字段的所有约束和索引

    原文MSSQL 如何删除字段的所有约束和索引 代码如下: ---------------------------------------------------------- --  mp_DropC ...

  2. 算法导论 6-2 d叉堆

    问题: d叉堆性质与二叉堆相似,但其每个非叶子结点有d个孩子: 1) 如何在一个数组中表示一个d叉堆? 2) 包含n个元素的d叉堆的高度是多少? 3) 给出 EXTRACT-MAX在d叉堆的有效实现, ...

  3. p2.js物理引擎学习

    P2简介 P2是一款基于Javascript编写的HTML5 2D物理引擎,和Box2D.Nape等2D物理引擎一样,P2集成了各种复杂的物理公式和算法,可以帮助我们轻松的实现碰撞.反弹等物理现象的模 ...

  4. sqlite性能简单測试

    主要測试sqlite在大数据量下的插入及查询性能: 測试环境:Centos6.4  1G内存  单核 数据量 大小 索引字段检索(耗时) 非索引字段检索(耗时) 总插入时间 10W 19M 0.001 ...

  5. jenkins+maven +svn+tomcat7集群部署(一)

    在网上看了好多有关集群部署的文章,感觉都不是太连贯,非常多仅仅是给你说怎么安装而已,可是过程中遇到的问题真不少,可是也攻克了非常多问题,希望我的文章可以帮到那些想学习的人吧,jenkins主要是攻克了 ...

  6. C++ 函数映射使用讲解

    想想我们在遇到多语句分支时是不是首先想到的是 switc case 和 if else if ... 这2种方式在编码方面确实简单少,但是当分支达到一定数量后,特别是分支内部有嵌套大段代码或者再嵌套分 ...

  7. probing元素

    https://msdn.microsoft.com/zh-cn/library/823z9h8w(v=vs.85).aspx 指定加载程序集时公共语言运行库要搜索的应用程序基子目录. <con ...

  8. 快速构建ASP.NET MVC Admin主页

    前言 后台开发人员一般不喜欢调样式,搞半天样式出不来,还要考虑各种浏览器兼容,费心费力不讨好,还好互联网时代有大量的资源共享,避免我们从零开始,现在就来看怎么快速构建一个ASP.NET MVC后台管理 ...

  9. 一个简单链表的C++实现

    /* LList.cpp * Author: Qiang Xiao * Time: 2015-07-12 */ #include<iostream> using namespace std ...

  10. 【Linux命令】杀死僵尸程序

    A zombie is already dead, so you cannot kill it. To clean up a zombie, it must be waited on by its p ...