2016-01-27 5 views
0

У меня проблема с userControl. Когда я пытаюсь навести его, чтобы изменить цвет всех компонентов, функция «ChangeColor» не срабатывает правильно.Изменение цвета элементов UserControl

Если я парить на этикетке или PictureBox в UserControl, он вызывается событие MouseLeave

Это мой UserControl

This is my userControl

public partial class infoUser : UserControl 
{ 
    public infoUser() 
    { 
     InitializeComponent(); 
    } 

    public void SetNome(string nome) 
    { 
     labelUserLogged.Text = nome; 
    } 

    public void ChangeColor(System.Drawing.Color color) 
    { 
     labelUserLogged.BackColor = color; 
     pictureBoxUser.BackColor = color; 
    } 

    private void infoUser_MouseHover(object sender, EventArgs e) 
    { 
     ChangeColor(Color.CadetBlue); 
    } 

    private void infoUser_MouseLeave(object sender, EventArgs e) 
    { 
     ChangeColor(Color.WhiteSmoke); 
    } 

} 

Код дизайнера

private void InitializeComponent() 
    { 
     this.labelUserLogged = new System.Windows.Forms.Label(); 
     this.pictureBoxUser = new System.Windows.Forms.PictureBox(); 
     ((System.ComponentModel.ISupportInitialize)(this.pictureBoxUser)).BeginInit(); 
     this.SuspendLayout(); 
     // 
     // labelUserLogged 
     // 
     this.labelUserLogged.BackColor = System.Drawing.SystemColors.Control; 
     this.labelUserLogged.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
     this.labelUserLogged.Cursor = System.Windows.Forms.Cursors.Hand; 
     this.labelUserLogged.Location = new System.Drawing.Point(0, 0); 
     this.labelUserLogged.Name = "labelUserLogged"; 
     this.labelUserLogged.Size = new System.Drawing.Size(167, 27); 
     this.labelUserLogged.TabIndex = 3; 
     this.labelUserLogged.Text = "Non loggato"; 
     this.labelUserLogged.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 
     // 
     // pictureBoxUser 
     // 
     this.pictureBoxUser.BackColor = System.Drawing.Color.Transparent; 
     this.pictureBoxUser.Cursor = System.Windows.Forms.Cursors.Hand; 
     this.pictureBoxUser.Image = global::Castor.Gestionale.Properties.Resources.user_icon; 
     this.pictureBoxUser.Location = new System.Drawing.Point(5, 6); 
     this.pictureBoxUser.Name = "pictureBoxUser"; 
     this.pictureBoxUser.Size = new System.Drawing.Size(18, 15); 
     this.pictureBoxUser.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; 
     this.pictureBoxUser.TabIndex = 4; 
     this.pictureBoxUser.TabStop = false; 
     // 
     // infoUser 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.Controls.Add(this.pictureBoxUser); 
     this.Controls.Add(this.labelUserLogged); 
     this.Name = "infoUser"; 
     this.Size = new System.Drawing.Size(171, 30); 
     this.MouseLeave += new System.EventHandler(this.infoUser_MouseLeave); 
     this.MouseHover += new System.EventHandler(this.infoUser_MouseHover); 
     ((System.ComponentModel.ISupportInitialize)(this.pictureBoxUser)).EndInit(); 
     this.ResumeLayout(false); 

    } 
+0

мы должны увидеть конструкцию управления для кода xaml или дизайнера. – jackjop

+0

Это WinForms или WPF? – Verbon

+0

@Verbon Это в WinForms –

ответ

0

Резервные элементы управления UserControl получают мышь, когда курсор находится в пределах его границ. Так что, когда ваша мышь «войти» в ярлык/PictureBox это «оставить» в UserControl и т.д.
Для того, чтобы конкретный дочерний элемент управления «прозрачным» для событий мыши вы можете использовать следующий трюк:

const int WM_NCHITTEST = 0x84, HTTRANSPARENT = (-1); 
class HitTestTransparentPictureBox : PictureBox { 
    protected override void WndProc(ref Message m) { 
     if(m.Msg == WM_NCHITTEST) { 
      m.Result = new IntPtr(HTTRANSPARENT); 
      return; 
     } 
     base.WndProc(ref m); 
    } 
} 
class HitTestTransparentLabel : Label { 
    protected override void WndProc(ref Message m) { 
     if(m.Msg == WM_NCHITTEST) { 
      m.Result = new IntPtr(HTTRANSPARENT); 
      return; 
     } 
     base.WndProc(ref m); 
    } 
} 

Затем вы можете заменить определенные элементы управления в вашем UserControl с их «мышами» прозрачными аналогами:

this.labelUserLogged = new HitTestTransparentLabel(); 
this.pictureBoxUser = new HitTestTransparentPictureBox(); 

После этого вы можете использовать следующий подход для создания парения эффекта на UserControl:

public infoUser() { 
    InitializeComponent(); 
    MouseEnter += infoUser_MouseEnter; 
    MouseLeave += infoUser_MouseLeave; 
} 
void infoUser_MouseLeave(object sender, EventArgs e) { 
    Hover = false; 
} 
void infoUser_MouseEnter(object sender, EventArgs e) { 
    Hover = true; 
} 
bool hoverCore; 
protected bool Hover { 
    get { return hoverCore; } 
    set { 
     if(hoverCore == value) return; 
     hoverCore = value; 
     OnHoverChanged(); 
    } 
} 
void OnHoverChanged() { 
    ChangeColor(Hover ? Color.CadetBlue : Color.WhiteSmoke); 
} 
+0

Я поместил этот код в свой userControl, но теперь ярлык и картинка не меняют цвет! –

+0

Я пробовал свой код с помощью предоставленных вами фрагментов кода. Но вы должны использовать события 'MouseEnter/MouseLeave' вместо' MouseHover/MouseLeave'. Я соответствующим образом обновил свой ответ. – DmitryG

Смежные вопросы