Я создал пользовательский элемент управления с некоторыми общедоступными атрибутами для использования в конструкторе макетов в 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;
}
}