Закрытие формы, которая была открыта ShowDialog()
У меня есть приложение winform, где я написал свой собственный маленький палитра цветов, который будет отображать только системные цвета. Это в основном TableLayoutPanel
с добавлением нескольких небольших панелей, для которых я просто установил цвет фона.
Довольно просто:
Теперь я открываю эту форму для:
using (frmColourWindow colourPicker = new frmColourWindow (Cursor.Position.X, Cursor.Position.Y, findingPriority))
{
colourPicker.ShowDialog();
if (!colourPicker.SelectedColor.IsEmpty)
{
pnlColor.BackColor = colourPicker._SelectedColor;
}
}
и закрывая его, установив DialogResult
когда пользователь нажал на одну из цветных панелей.
Все это работает довольно хорошо, единственное, что мне не удается сделать правильно, это закрыть форму, когда она теряет фокус (например, когда пользователь нажимает в другом месте или начинает печатать). Я посмотрел на Deactivate
, LostFocus
, а также Leave
События. Просто не могу заставить эти события срабатывать, когда я этого хочу. Может я что-то упускаю очевидное?
2 ответа
Как я уже упоминал в комментариях, при использовании ShowDialog()
Вы можете использовать только диалог, который вы открыли, и поэтому он никогда не теряет фокус, поэтому событие как Deactivate
, LostFocus
а также Leave
не сработает
Вам нужно использовать Show()
Команда использовать эти события, чтобы закрыть открытую форму.
Что касается решения проблемы, вы указали в комментариях о назначении цвета для объекта. Вы можете сделать следующее:
Объявить публичную собственность
Color SelectedColor {get; private set; }
В палитре цветов измените оператор использования следующим образом:
var colourPicker = new frmColourWindow (Cursor.Position.X, Cursor.Position.Y, findingPriority);
colourPicker.Closed += (o, args) => { pnlColor.BackColor = colourPicker.SelectedColor };
colourPicker.Show();
Это, конечно, только одно из многих возможных решений для этого.
Вы можете добиться этого, отображая форму с Show()
метод, а затем с помощью события Form.Deactivate.