我使用具有可編輯內容的代碼構建GUI。當用戶點擊靜態顯示時,控件被換出一個允許編輯的控件。在某些情況下,顯示控件(例如Label
)會換出一組控件,如ComboBox
和TextBox
。檢測從一組WPF控件丟失的焦點
我想要檢測何時從我的可編輯控件組中丟失焦點,以便將界面從編輯器切換回該項目的顯示錶示。
例如,我可能在像Panel1(Panel2(Button1, Button2), Button3)
這樣的樹中有一個GUI,並且我想要檢測何時從Panel2
丟失焦點。我嘗試以下(F#代碼):
open System.Windows
let button1 = Controls.Button(Content="1")
let button2 = Controls.Button(Content="2")
let button3 = Controls.Button(Content="3")
[<System.STAThreadAttribute>]
do
let panel1 = Controls.StackPanel()
let panel2 = Controls.StackPanel()
panel2.Children.Add button1 |> ignore
panel2.Children.Add button2 |> ignore
panel1.Children.Add panel2 |> ignore
panel1.Children.Add button3 |> ignore
panel2.LostFocus.Add(fun _ ->
printfn "Panel2 lost focus")
Application().Run(Window(Content=panel1))
|> ignore
當點擊button3
button2
已經被點擊後,如預期,則觸發事件panel2.LostFocus
,因爲搬出panel1
到button3
焦點。但是,button2
點擊button1
被點擊後也被觸發,即使panel2
從未失去焦點。
閱讀有關重點MSDN文檔中的WPF我嘗試添加:
Input.FocusManager.SetIsFocusScope(panel2, true)
但是這實際上使問題變得更糟!現在panel2.LostFocus
事件僅在從panel2
的一個孩子轉移到另一個孩子時才被觸發,而當panel2
實際上失去焦點時纔會觸發該事件。
我應該如何獲得所需的效果?