【问题标题】:Better way to refresh a custom control刷新自定义控件的更好方法
【发布时间】:2013-02-05 17:55:43
【问题描述】:

我正在学习如何编写自定义控件以及管理和引发事件。 我创建了一个毫无意义的自定义控件,您可以在 main 上添加一条线并决定大小和颜色。我还做了一个事件来替换 OnClick(我只是在学习),我称之为 MyClick。这是代码

public class EditedLine : UserControl
{
    public delegate void LineClickEventHandler(object sender, EditedLineClickEventArgs e);

    [Description("Occurs when control is clicked")]
    public event LineClickEventHandler MyClick;

    private Color _color;
    private float _size;

    public EditedLine()
    {
        _color = Color.Black;
        _size = 3;
    }
    public EditedLine(Color color, float size)
    {
        _color = color;
        _size = size;
    }

    public Color LineColor
    {
        get { return _color; }
        set { _color = value; }
    }
    public float LineSize
    {
        get { return _size; }
        set { _size = value; }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.DrawLine(new Pen(_color, _size), new Point(0, 0), new Point(this.Size.Width, 0));
    }
    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        OnLineClick(new EditedLineClickEventArgs());
    }

    protected virtual void OnLineClick(EditedLineClickEventArgs e)
    {
        if (MyClick != null)
        {
            MyClick(this, e);
        }
    }
}

}

幸运的是一切正常。我可以在控件工具箱中看到我的控件,我可以添加到我的项目中,即使事件正在运行。 但是,如果在 MyClick 中我尝试更改线条的颜色,则不会发生任何事情。 我必须使用这个属性而不是之前的属性:

    public Color LineColor
    {
        get { return _color; }
        set { _color = value; this.Refresh();  }
    }
    public float LineSize
    {
        get { return _size; }
        set { _size = value; this.Refresh();  }
    }

所以我问自己是否有更好的方法来刷新控件。如果我重画一条线很容易做到,但如果它是一个更复杂的控件呢?我想做一个“重绘”私有方法,但我不知道如何访问 EditedLine istance 的“图形”对象。 “INotifyPropertyChanged”有用吗?但是“图形”仍然是我最大的问题

【问题讨论】:

  • 我正在寻找重绘控件(或其一部分)的最佳方法,而无需在每次属性更改时调用 refresh()

标签: c# visual-studio events controls


【解决方案1】:

如果您正在谈论更复杂的控件,请考虑将 Refresh 更改为 Invalidate 以使您的 UserControl 的特定区域无效。 要获取Graphics 对象,只需调用CreateGraphics 方法。

【讨论】:

  • CreateGraphics 擅长引起闪烁。建议应该是使用由绘制事件提供的 Graphic 对象。
  • @LarsTech 问题是 - 我怎样才能获得图形对象。 CreateGraphics 是肯定的。和Paint 原因事件。但是由于作者已经有 OnPaint 事件,所以我提到了CreateGraphics
  • 是否可以安全地将 e.Graphic 存储在私有变量中并在每次属性更改时调用 _graphic.DrawLine(假设我已经在 OnPaint 中完成了 _graphic=e.Graphic)?
  • 其实你不应该这样做。由于您所有的绘画都发生在OnPaint 事件中,因此您已经拥有Graphics 对象。
  • 那么......我可以在一个礼仪中自己调用 OnPaint 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多