2013-05-20 4 views
0

Для моих полей со списком в моем приложении я хочу разрешить пользователю редактировать коллекцию, к которой привязаны элементы управления. Чтобы сделать это, я хочу иметь кнопку, которая появляется, когда курсор находится над элементом управления. Итак, я создал пользовательский элемент управления с комбинированным полем и кнопкой на нем. Тем не менее, у меня возникла проблема с тем, чтобы кнопка отображалась в нужное время. Вот мой код:Показать кнопку, когда родительский указатель в родительском элементе управления

public partial class CollectionDropDown : UserControl 
    { 
     public CollectionDropDown() 
     { 
      InitializeComponent(); 
      SetEventsRecursively(Controls); 
     } 

     public void SetEventsRecursively(ControlCollection controls) 
     { 
      foreach (Control ctrl in controls) 
      { 
       ctrl.MouseLeave += new EventHandler(ctrl_MouseLeave); 
       ctrl.MouseEnter += new EventHandler(ctrl_MouseEnter); 
       SetEventsRecursively(ctrl.Controls); 
      } 
     } 

     void ctrl_MouseEnter(object sender, EventArgs e) 
     { 
      button1.Visible = true; 
     } 

     void ctrl_MouseLeave(object sender, EventArgs e) 
     { 
      button1.Visible = false; 
     } 
    } 

Таким образом, идея в том, что все элементы управления будут иметь тот же мышь входит/выходит так, когда мышь входит весь контроль кнопка будет видна, и когда он оставляет бы быть невидимым. Проблема заключается в том, что событие ввода «мышь» срабатывает перед входом. Поэтому, когда вы перемещаете мышь в элемент управления, кнопка становится видимой. Но когда вы пытаетесь перейти к кнопке, независимо от того, какой контроль над курсором закончился, мышь уходите, и кнопка становится невидимой, прежде чем «ввести» ее. Есть предположения?

+1

Почему бы не добавить некоторую логику, чтобы узнать, действительно ли мышь находится в элементе управления? – emd

+1

По крайней мере, одна причина, по которой это не работает, заключается в том, что вы забыли о событиях ввода/выхода для самого элемента управления. Мигающая кнопка не так уж и хороша, лучший способ сделать это - использовать только событие Enter, а затем запустить таймер 200 мс, который проверяет, не больше ли мыши над элементом управления. –

+0

@HansPassant Извините, у меня есть это событие, связанное с родителем, это просто сделано через дизайнера. Однако мне нравится идея таймера. – Nick

ответ

0

Я использовал предложение EMD, чтобы проверить, если мышь была в пределах контроля в случае отпуска мыши.

if (!this.RectangleToScreen(ClientRectangle).Contains(Cursor.Position)) 
       button1.Visible = false; 

Это дало результат, который я хотел.

0

Попробуйте что-нибудь подобное. Я не уверен, если синтаксис является правильным

Control ctrl = null; 
    void ctrl_MouseEnter(object sender, EventArgs e) 
    { 

     If (ctrl == null) 
     { 
      button1.Visible = true; 
      ctrl = sender; 
     } 
    } 

    void ctrl_MouseLeave(object sender, EventArgs e) 
    { 

     If (ctrl != null && ctrl.Equals(sender)) 
     { 
      button1.Visible = false; 
      ctrl = null; 
     } 
    }