2015-06-05 5 views
2

У меня есть WindowForm и некоторые элементы управления.Как скрыть контроль при нажатии на него?

Моей целью является то, что когда я нажимаю кнопку «?» в правом верхнем углу окна datagridview он отобразит окно с изображением, а когда я выйду за пределы pictureBox, он должен быть невидимым.

Мой MainForm MainForm

MyPictureBox

enter image description here

Я искал некоторые темы на этом сайте, но некоторые не работают, некоторые работают частично. Мне нравится this.

Я также попытался:

void pictureBox1_LostFocus(object sender, EventArgs e) 
    { 
     if (pictureBox1.Visible) 
      pictureBox1.Visible = false; 
    } 

Но когда я нажимаю на button2, Button3, ... The PictureBox не был невидим.

Любое решение будет высоко оценено.

+0

С какими событиями вы это попробовали (LostFocus, Leave)? Если он не работает, я бы просто вызвал каждый элемент управления, который не является частью «MyPictureBox» -Control 'pictureBox1.Visible = false;'. Это быстрое решение, но не лучшее ... – C0d1ngJammer

+0

Сохраните это в своей форме load 'pictureBox1.MouseLeave + = (s, e) => {pictureBox1.Visible = false; } 'и попробуйте. –

+0

Вы поставили точку останова и проверить, действительно ли код запускается? Очевидно, что если вы можете отлаживать «pictureBox1_LostFocus», функция фактически связана с назначенным элементом управления. – fujiFX

ответ

0

Добавить этот метод в designer.cs:

pictureBoxEvent this.MouseLeave += new EventHandler(pictureBox_MouseLeave); 

Добавьте этот код в файл CS:

private void pictureBox_MouseLeave(object sender, EventArgs e) 
{ 
    pictureBox1.Visible = false; 
} 
0

Я думаю, что ваш pictureBox1 не теряет фокус, потому что она никогда не GOT сосредоточенным. Настройте фокусировку, сделав ее видимой.

0

О, я столкнулся с этим раньше ...

Я делал метку, что вы могли бы двойной клик, и это позволит вам редактировать Label.Text, как TextBox. Однако у меня возникли проблемы с подключением к событиям, чтобы узнать, когда пользователь нажал кнопку «Управление» и хотел прекратить редактирование. Я пробовал Control.LostFocus и Control.Leave, но ничего. Я даже разочаровался/отчаялся и попробовал некоторых глупых, таких как Control.Invalidated.

Что я должен был сделать, это подписаться на событие Click формы/контейнера/управления за ним.

Однако, возлагая ответственность за подключение этого мероприятия в форму, которая хочет использовать ее, является плохой дизайн. Однако вы можете сделать конструктор для класса Control ссылкой на владельца/родителя/контейнера в качестве параметра. Таким образом, требования не скрыты, они должны быть удовлетворены, прежде чем вы сможете получить экземпляр объекта, и элемент управления может подключаться к Form.Click внутри себя, где эта логика принадлежит.

private Form owner; 

    public EditLabel(Form Owner) 
    { 
     this.owner = Owner; 
     owner.Click += EndEditing; 
    } 
Смежные вопросы