2016-12-14 9 views
1

У меня есть приложение winform, где я написал свой собственный небольшой набор цветов, который будет отображать только системные цвета. Это в основном TableLayoutPanel с добавлением к нему кучи небольших панелей, на которые я просто установил цвет фона.Закрытие формы, открывшейся ShowDialog()

Довольно просто:

enter image description here

Теперь я открываю эту форму с:

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. Просто не могу заставить эти события стрелять, когда я хочу их. Может, мне что-то не хватает?

+0

При открытии формы с помощью 'ShowDialog()' вы можете использовать эту форму только до тех пор, пока она не будет закрыта. Если я правильно понимаю, что вы хотите, используйте 'Show()' вместо 'ShowDialog()', тогда эти события должны срабатывать. –

+0

Вы, безусловно, делаете, выбираете панель и выбираете ApplicationSettings. Нажмите F1, если вам нужна дополнительная помощь. –

+0

@Bojan, как мне получить выбранный цвет из моего выбора цвета, если я использую 'Show()', а затем 'Close()' форму программно изнутри набора цветов? Поскольку маленькая панель в спине должна быть установлена ​​на этот цвет после того, как форма закрывается –

ответ

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(); 

Это, конечно, только один из многих возможных решений для этого.

+0

работает как шарм! –

+0

Конечно, он потеряет фокус, если он активирует другую программу. –

0

Вы можете достичь этого, указав форму с помощью метода Show(), а затем используя событие Form.Deactivate.

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