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);
        }
    }
}

}

幸いなことに、すべてが機能しています。コントロールツールボックスで自分のコントロールを確認でき、イベントが機能していてもプロジェクトに追加できます。しかし、MyClick内で線の色を変更しようとしても、何も起こりません。私は以前のものの代わりにこのプロパティを使用する必要があります:

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

だから私は、コントロールを更新するためのより良い方法があるかどうかを自問しています。単一の線を再描画する場合は簡単ですが、より複雑なコントロールの場合はどうでしょうか。「Redraw」プライベートメソッドを実行しようと思いましたが、EditedLineインスタンスの「Graphic」オブジェクトにアクセスする方法がわかりません。'INotifyPropertyChanged'は役に立ちますか?しかし、「グラフィック」は依然として私の最大の問題です

4

1 に答える 1

0

より複雑なコントロールについて話している場合は、に変更RefreshInvalidateてUserControlの特定の領域を無効にすることを検討してください。Graphicsオブジェクトを取得するには、CreateGraphicsメソッドを呼び出すだけです。

于 2013-02-05T18:32:32.680 に答える