Закрытие формы, которая была открыта 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.

Другие вопросы по тегам