2016-12-14 89 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,LostFocusLeave事件。當我想要他們時,似乎無法讓這些事件觸發。也許我錯過了一些明顯的東西?

+0

當打開一個表格'ShowDialog的()'你只能「利用」這種形式,直到它已被關閉。如果我理解你想要的東西,使用'Show()'而不是ShowDialog()',那麼這些事件應該會觸發。 –

+0

您當然可以,選擇面板並點擊ApplicationSettings。如果您需要更多幫助,請按F1。 –

+0

@Bojan,如果我使用'Show()',然後'Close()'表單從編程的顏色選擇器內,我如何從我的顏色選擇器中獲取選定的顏色?因爲一旦表單關閉,後面的小面板必須設置爲該顏色 –

回答

2

正如我在評論中所提到的,當使用ShowDialog(),你只能使用對話框,你可以打開,因此它永遠不會失去焦點,所以事件一樣DeactivateLostFocusLeave將無法​​正常工作。

您需要使用Show()命令來使用這些事件來關閉打開的表。

至於解決您的評論中指出有關分配的顏色對象的問題。你可以做到以下幾點:

申報的公共屬性

Color SelectedColor {get; private set; } 

在你的顏色選擇器,並改變你的using語句來此:

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事件實現這一目標。

相關問題