Применить мои пользовательские атрибуты из панели инструментов в предварительный просмотр макета - PullRequest
0 голосов
/ 20 июня 2019

Я создал пользовательский элемент управления с некоторыми общедоступными атрибутами для использования в конструкторе макетов в Visual Studio, которые управляют видимостью других элементов управления в этом пользовательском элементе управления. Чтобы инициализировать эти элементы управления, я поместил инициализацию в конструктор пользовательского элемента управления. Но если я использую этот подход, эти атрибуты устанавливаются после инициализации объекта, а значения из дизайнера макетов не применяются. Мое решение состоит в том, чтобы установить значения в методе OnPaint, но я не чувствую, что этот подход лучше, хотя он работает таким образом. Каков будет правильный способ реализации этих атрибутов здесь?

public class TitlePanel : Panel
{
    public bool Min_enabled {get;set;}
    public bool Max_enabled { get; set; }
    public Label Title_Lable = new System.Windows.Forms.Label();
    private IST_Button[] TitleBar_Buttons = new IST_Button[3];
    private Point startPoint = new Point(0, 0);
    private bool drag;
    private Form parent_form;
    private bool title_buttons_set=false;

    public TitlePanel()
    {

    }

    public void initialize_Components()
    {
        this.Title_Lable.AutoSize = true;
        this.Title_Lable.Font = IST.font.Title1;
        this.Title_Lable.ForeColor = SystemColors.ButtonHighlight;
        this.Title_Lable.Location = new Point(12, 5);
        this.Title_Lable.Name = "Title_Lable";
        this.Title_Lable.Size = new Size(51, 17);
        this.Title_Lable.TabIndex = 0;
        this.Title_Lable.Text = "no title";
        this.BackColor = IST.color.bluesteel;
        this.Controls.Add(this.Title_Lable);
        this.Location = new Point(0, 0);
        this.Size = new Size(400, 25);
        Console.WriteLine("Min_enable = "+Min_enabled.ToString());
        set_mouse_handler();
    }

    public void set_title(string title)
    {
        Title_Lable.Text = title;
    }

    public void set_parent_form(Form parent)
    {
        parent_form = parent;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        if (!(title_buttons_set))
            set_title_buttons();
    }

    private void set_title_buttons()
    {
        if (Min_enabled)
        {
            TitleBar_Buttons[0] = ini_title_bar_button(Properties.Resources.min, "min");
            TitleBar_Buttons[0].MouseUp += new MouseEventHandler(Min_Click);
        }
        if (Max_enabled)
        {
            TitleBar_Buttons[1] = ini_title_bar_button(Properties.Resources.max, "max");
            TitleBar_Buttons[1].MouseUp += new MouseEventHandler(Max_Click);
        }
        TitleBar_Buttons[2] = ini_title_bar_button(Properties.Resources.Close2, "close");
        TitleBar_Buttons[2].MouseUp += new MouseEventHandler(Close_Click);
        title_buttons_set = true;
    }

    private void Close_Click(object sender, EventArgs e)
    {
        parent_form.Close();
    }

    private void Max_Click(object sender, EventArgs e)
    {
        if (parent_form.WindowState == FormWindowState.Maximized)
            parent_form.WindowState = FormWindowState.Normal;
        else
            parent_form.WindowState = FormWindowState.Maximized;
    }

    private void Min_Click(object sender, EventArgs e)
    {
        parent_form.WindowState = FormWindowState.Minimized;
    }

    private IST_Button ini_title_bar_button(byte[] svg_icon, string name)
    {
        IST_Button new_button = new IST_Button();
        new_button.FlatAppearance.BorderSize = 0;
        new_button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
        new_button.Font = IST.font.Button;
        new_button.ForeColor = Color.White;
        new_button.Dock = DockStyle.Right;
        new_button.Name = name;
        new_button.Size = new Size(40, 20);
        new_button.TabIndex = 3;
        new_button.Text = "";
        new_button.Margin = new Padding(10,0,20,0);
        new_button.UseVisualStyleBackColor = true;
        Stream s = new MemoryStream(svg_icon);
        new_button.Image = Image.ResizeImageProportional(Svg.SvgDocument.Open<Svg.SvgDocument>(s).Draw(), 15, 15);
        this.Controls.Add(new_button);
        return new_button;
    }

    private void set_mouse_handler()
    {
        this.MouseDown += new MouseEventHandler(IST_TitlePanel_MouseDown);
        this.MouseUp += new MouseEventHandler(IST_TitlePanel_MouseUp);
        this.MouseMove += new MouseEventHandler(IST_TitlePanel_MouseMove);
        this.Title_Lable.MouseDown += new MouseEventHandler(IST_TitlePanel_MouseDown);
        this.Title_Lable.MouseUp += new MouseEventHandler(IST_TitlePanel_MouseUp);
        this.Title_Lable.MouseMove += new MouseEventHandler(IST_TitlePanel_MouseMove);
    }

    private void IST_TitlePanel_MouseUp(object sender, MouseEventArgs e)
    {
        this.drag = false;
    }

    private void IST_TitlePanel_MouseMove(object sender, MouseEventArgs e)
    {
        if (this.drag)
        { // if we should be dragging it, we need to figure out some movement
            Point p1 = new Point(e.X, e.Y);
            //Console.WriteLine(parent_form.PointToScreen(p1).ToString());
            Point p2 = this.PointToScreen(p1);
            Console.WriteLine(p2.ToString());
            Point p3 = new Point(p2.X - this.startPoint.X,
                                 p2.Y - this.startPoint.Y);
            parent_form.Location = p3;
        }
    }

    private void IST_TitlePanel_MouseDown(object sender, MouseEventArgs e)
    {
        this.startPoint = parent_form.Location;
        Console.WriteLine(this.startPoint.ToString());
        this.drag = true;
    }
}
...