由于要求MyRect要是只读属性,不能执行invalidate,即使我将它改成非只读属性,并在set{}中添加invalidate方法,它也并不执行.大家帮帮忙
解决方案 »
- 大家帮忙看下c# SerialPort控件短信猫读取数据不完整
- Socket通讯
- c# 调用 搜索引擎
- 启动项目
- 请教Winform:一个窗体如何切换多个MainMenu?
- CrystalReport1 crport = new CrystalReport1();这样不对吗?
- 关于datagrid中的label从数据库取也为空时,label,及br不显示的问题
- 帮我看看错在那里
- combobox控件请教
- C#中,后台处理文件和前台的页面怎么对应了?
- |ZYCWPF| VLC取视频图像并作RTST源发布,但取出来的视频延时太多了,大家帮看一下怎么办 谢谢
- 那位大侠有 ItemsControl 类的源码
{
List.Add(rect);
//试试在这里进行重绘
}
invalidate 之后调用 update试试。或者直接调用refresh试试。
this.invalidate();
this.update();
或者
this.refresh();
{
public Userconrol()
{
myRect.MyRectChanged += myRect_MyRectChanged;
} void myRect_MyRectChanged(object sender, EventArgs e)
{
Invalidate();
} private MyRectCollectin myRect = new MyRectCollectin(); public class MyRectCollectin : CollectionBase
{
public event EventHandler MyRectChanged; public myRect this[int index]
{
get
{
return (myRect)List[index];
}
}
public void Add(myRect rect)
{
List.Add(rect);
if (MyRectChanged != null)
MyRectChanged(rect, null);
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
MessageBox.Show("Index not valid!");
}
else
{
List.RemoveAt(index);
if (MyRectChanged != null)
MyRectChanged(index, null);
}
}
}
}
试过了,仍然没有立即刷新,添加集合中新的项时,在add处添加断点,似乎并没有走进去.因此没有触发这个事件,但是集合中的count确实增加了1.
{
private Point position;
private int radius;
public Point Position
{
get
{
return position;
}
set
{
position = value;
}
}
public int Radius
{
get
{
return radius;
}
set
{
radius = value;
}
}
}
public partial class MyButton : Control
{
public MyCircleCollection m_MyCircle = new MyCircleCollection();
public MyButton()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
m_MyCircle.ItemChanged += OnItemChanged;
}
public void OnItemChanged(object sender,EventArgs e)
{
this.Invalidate();
}
public class MyCircleCollection : CollectionBase
{
public event EventHandler ItemChanged; public MyCircle this[int index]
{
get
{
return (MyCircle)List[index];
}
}
public void Add(MyCircle circle)
{
List.Add(circle);
ItemChanged(this, null);
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
MessageBox.Show("Index not valid!");
}
else
{
List.RemoveAt(index);
}
ItemChanged(this, null);
}
}
protected override void OnPaint(PaintEventArgs e)
{
if (MyCircle.Count != 0)
{
foreach (MyCircle c in MyCircle)
{
e.Graphics.DrawEllipse(Pens.Black, c.Position.X, c.Position.Y, c.Radius, c.Radius);//Draw circle
}
}
}
}
大致是这样,就是在一个自定义控件上画圆圈,其实和你的代码差不多.但是不起效果.
{
private Point position;
private int radius;
public Point Position
{
get
{
return position;
}
set
{
position = value;
}
}
public int Radius
{
get
{
return radius;
}
set
{
radius = value;
}
}
}
public partial class MyButton : Control
{
public MyCircleCollection m_MyCircle = new MyCircleCollection();
public MyButton()
{
//这句得去掉this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
m_MyCircle.ItemChanged += OnItemChanged;
}
public void OnItemChanged(object sender, EventArgs e)
{
this.Invalidate();
}
public class MyCircleCollection : CollectionBase
{
public event EventHandler ItemChanged; public MyCircle this[int index]
{
get
{
return (MyCircle)List[index];
}
}
public void Add(MyCircle circle)
{
List.Add(circle);
ItemChanged(this, null);
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
MessageBox.Show("Index not valid!");
}
else
{
List.RemoveAt(index);
}
ItemChanged(this, null);
} }
protected override void OnPaint(PaintEventArgs e)
{
if (m_MyCircle.Count != 0)
{
foreach (MyCircle c in m_MyCircle)
{
e.Graphics.DrawEllipse(Pens.Black, c.Position.X, c.Position.Y, c.Radius, c.Radius);//Draw circle
}
}
}
}调用: public partial class Form3 : Form
{
public Form3()
{
InitializeComponent(); this.Load += Form3_Load;
} void Form3_Load(object sender, EventArgs e)
{
MyButton btn = new MyButton();
btn.Name = "myBtn";
btn.Width = this.Width;
btn.Height = this.Height;
btn.Location = new Point(5, 5);
this.Controls.Add(btn); } private void button1_Click(object sender, EventArgs e)
{
MyButton btn = this.Controls["myBtn"] as MyButton;
Random r = new Random();
btn.m_MyCircle.Add(new MyCircle { Position = new Point(r.Next(0, this.Width / 2), r.Next(this.Height / 2)), Radius = 10 });
}
}
您接着等大神吧,
good luck