Как получить пользовательский элемент управления C # .net для обновления внешнего вида во время разработки? - PullRequest
0 голосов
/ 25 ноября 2018

ОК. У меня есть круговая кнопка, которую я расширил в классе кнопок.См. Ниже:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace CircleButton
{

public class CircleButton : Button
{
    private Color _fillColor = Color.Red;
    private Color _hoverColor = Color.Blue;


    [Category("Custom")]
    [Browsable(true)]
    [Description("Sets the fill color of the round button")]
    [Editor(typeof(System.Windows.Forms.Design.WindowsFormsComponentEditor), typeof(System.Drawing.Color))]
   public Color FillColor
    {
        set
        {
            this._fillColor = value;

        }
        get
        {
            return this._fillColor;

        }
    }

    [Category("Custom")]
    [Browsable(true)]
    [Description("Sets the Hover color of the round button")]
    [Editor(typeof(System.Windows.Forms.Design.WindowsFormsComponentEditor), typeof(System.Drawing.Color))]
    public Color HoverColor
    {
        set
        {
            this._hoverColor = value;


        }
        get
        {
            return this._hoverColor;
        }
    }


    protected override void OnPaint(PaintEventArgs pevent)
    {
        GraphicsPath gp = new GraphicsPath();
        gp.AddEllipse(0, 0, ClientSize.Width, ClientSize.Height);
        this.Region = new System.Drawing.Region(gp);
        base.OnPaint(pevent);
    }

    protected override void OnCreateControl()
    {
        this.FlatAppearance.MouseOverBackColor = this._hoverColor;
        this.FlatAppearance.BorderSize = 0;
        this.BackColor = this._fillColor;
        this.FlatStyle = FlatStyle.Flat;
        base.OnCreateControl();
    }  
}

В Visual Studio Designer все отлично работает, но когда я выбираю свойства FillColor и HoverColor во время разработки, цвета в элементе управления временем разработки не обновляются.
Сохранить впомните, что цвета действительно показывают соответствующие изменения во время выполнения.

Может быть, я пропускаю другую директиву или что-то?Я искал, но не смог найти ответ.Я потратил 2 дня на это.

Этот элемент управления будет передан другому разработчику и должен работать должным образом во время разработки.

Любая помощь будет наиболее ценной.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Хорошо, так что я наконец-то решил эту проблему, изменив свойство в установщике, добавив метод Invalidate ():

if (this._fillColor != value)
            {
                this._fillColor = value;
                this.BackColor = this._fillColor;  ///<--Added this line worked
                this.Invalidate();
            }

Спасибо за ваши замечательные предложения и ответы, я очень ценю вашу помощь!

0 голосов
/ 25 ноября 2018

Я рекомендую прочитать эти статьи:

Короче говоря, вам нужно вызвать Invalidate() в ваших установщиках свойств, поскольку это вызывает возможную перерисовку (перерисовки не являются немедленными: запрос на перерисовку на самом деле очереди перерисовка, поэтому, если заданы два или более свойств, элемент управления будет перекрашиваться только один раз (поэтому свойства пользовательского интерфейса должны бытьв потоке пользовательского интерфейса).

Вы также должны выполнить проверки на равенство в установщиках свойств, чтобы предотвратить ненужное перерисовывание, например:

[Category("Custom")]
[Browsable(true)]
[Description("Sets the Hover color of the round button")]
[Editor(typeof(System.Windows.Forms.Design.WindowsFormsComponentEditor), typeof(System.Drawing.Color))]
public Color HoverColor
{
    get
    {
        return this._hoverColor;
    }
    set
    {
        if( this._hoverColor != value )
        {
            this._hoverColor = value;
            this.Invalidate();
        } 
    }
}

(Совет по стилю: В последние годы разработчик C #Экосистема (и Microsoft тоже) начали использовать идентификаторы с префиксом _underscore только для static полей и обычные camelCase для полей экземпляра, но всегда доступны с this., поэтому я бы хотелизменить this._hoverColor на this.hoverColor).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...