После добавления метки к элементам Picturebox события не запускаются - C # - PullRequest
0 голосов
/ 13 ноября 2018

У меня странное поведение с классом, который я создал, унаследованным от PictureBox;

это класс, созданный для поведения, как кнопка (в основном, меня волнует ввод мыши, выход из мыши, нажатие мыши вниз), mouse up events).

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

хотел бы знать, в чем причина такого поведения, и если есть какое-либо исправление для него.

public class RoundedButton : PictureBox
{
    private readonly Image r_BasicImage =  RoundedButtonCheck2.Properties.Resources.basicRoundedButtonIcon as Image;
    private readonly Image r_HoverImage = RoundedButtonCheck2.Properties.Resources.hoverRoundedButtonIcon as Image;
    private readonly Image r_ClickImage = RoundedButtonCheck2.Properties.Resources.clickRoundedButtonIcon as Image;

    private string m_Text;
    private Font m_Font;
    public Color m_TextColor;
    private Label LabelText = new Label();


    public RoundedButton()
    {
        this.Width = 130;
        this.Height = 40;
        this.Image = r_BasicImage;
        this.BackColor = Color.Transparent;
        this.SizeMode = PictureBoxSizeMode.StretchImage;
        this.MouseDown += RoundedButton_MouseDown;
        this.MouseUp += RoundedButton_MouseUp;
        this.MouseEnter += RoundedButton_MouseEnter;
        this.MouseLeave += RoundedButton_MouseLeave;
        LabelText.Font = ButtonFont;
        ButtonTextColor = Color.Black;
        //PROBLEMATIC CODE HERE:
        ***********this.Controls.Add(LabelText);***************
    }

    public Color ButtonTextColor
    {
        get
        {
            return m_TextColor;
        }
        set
        {
            m_TextColor = value;
            LabelText.ForeColor = m_TextColor;
        }
    }
    public Font ButtonFont
    {
        get
        {
            if (m_Font == null)
            {
                m_Font = new Font("Calibri Light", 12);
            }
            return m_Font;
        }
        set
        {
            m_Font = value;
            LabelText.Font = ButtonFont;
            adjustLabel();
        }
    }

    public string ButtonText
    {
        get
        {
            return m_Text;
        }
        set
        {

            m_Text = value;
            LabelText.Text = m_Text;
            adjustLabel();
        }
    }
    private void adjustLabel()
    {
        const int MARGIN = 10;
        LabelText.AutoSize = true;//needed for autosize calculation of the label;
        Size newSize = new Size(LabelText.Size.Width, LabelText.Size.Height); ;
        LabelText.AutoSize = false;//after auto-calculated size of the label, set to false in order for centering label works well.
        this.MinimumSize = newSize;
        this.Size = new Size(newSize.Width + MARGIN, newSize.Height + MARGIN);
        LabelText.TextAlign = ContentAlignment.MiddleCenter;
        LabelText.Dock = DockStyle.Fill;
    }

    private void RoundedButton_MouseLeave(object sender, EventArgs e)
    {
        RoundedButton hoveredButton = sender as RoundedButton;
        if (hoveredButton != null)
        {
            hoveredButton.Image = r_BasicImage;
            hoveredButton.SizeMode = PictureBoxSizeMode.StretchImage;
        }
    }

    private void RoundedButton_MouseEnter(object sender, EventArgs e)
    {
        RoundedButton hoveredButton = sender as RoundedButton;
        if (hoveredButton != null)
        {
            hoveredButton.Image = r_HoverImage;
            hoveredButton.SizeMode = PictureBoxSizeMode.StretchImage;
        }
    }

    private void RoundedButton_MouseUp(object sender, MouseEventArgs e)
    {
        RoundedButton clickedButton = sender as RoundedButton;
        if (clickedButton != null)
        {
            clickedButton.Image = r_BasicImage;
            clickedButton.SizeMode = PictureBoxSizeMode.StretchImage;

        }
    }

    private void RoundedButton_MouseDown(object sender, MouseEventArgs e)
    {
        RoundedButton clickedButton = sender as RoundedButton;
        if (clickedButton != null)
        {
            clickedButton.Image = r_ClickImage;
            clickedButton.SizeMode = PictureBoxSizeMode.StretchImage;

        }
    }
}

спасибо на продвинутом, tomer.

...