2013-02-05 54 views
0

我正在學習如何編寫自定義控件並管理和引發事件。 我創建了一個毫無意義的自定義控件,您可以添加一條主線並決定大小和顏色。我也做了一個事件來取代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); 
     } 
    } 
} 

}

luckly萬物工作。我可以在控件工具箱中看到我的控件,並且可以添加到我的項目中,即使事件正在運行。 但是,如果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的'Graphic'對象。 'INotifyPropertyChanged'有用嗎?但'圖形'仍然是我最大的問題

+0

我正在尋找重繪控件(或其中的一部分)的最佳方式,而無需在每個屬性更改處調用refresh() – Andrea

回答

0

如果您在談論更復雜的控制,則考慮將Refresh更改爲Invalidate以使您的UserControl的特定區域無效。 要獲得Graphics對象只需撥打CreateGraphics方法。

+0

CreateGraphics善於引起閃爍。建議應該是使用繪畫事件提供的Graphic對象。 – LarsTech

+0

@LarsTech的問題是 - 我怎樣才能獲得圖形對象。 'CreateGraphics'是一件確定的事情。和'塗料'事件的原因。但是因爲作者已經有了OnPaint事件,所以我提到了'CreateGraphics'。 – nikita

+0

將e.Graphic存儲在私有變量中並在每個屬性更改中調用_graphic.DrawLine(假設我已在_Paint內部完成_graphic = e.Graphic)是安全的? – Andrea