您的位置:首页 > 其它

WPF-22:WPF绘制五角星改进版(增加半个五角星的绘制)-修改bug

2013-07-19 18:24 316 查看
之前用坐标画多边形的方法,绘制五角星。今天调试时发现当时写的时候有bug,修改一下。
原文:
/article/1419416.html,当时没测试绑定的问题,一测试发现绑定有问题。原来是多颗五角星控件中,依赖属性的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐