編集可能なコンテンツを持つコードを使用して GUI を構築しています。ユーザーが静的ディスプレイをクリックすると、コントロールが編集可能なコントロールに切り替わります。場合によっては、表示コントロール (例: ) がやLabel
などのコントロールのグループに置き換えられます。ComboBox
TextBox
インターフェイスをエディターからそのアイテムの表示表現に戻すために、編集可能なコントロールのグループからフォーカスが失われたことを検出したいと考えています。
たとえば、次のようなツリーに GUI があり、Panel1(Panel2(Button1, Button2), Button3)
からフォーカスが失われたことを検出したいとし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
がクリックされた後に がクリックされると、panel2.LostFocus
イベントがトリガーされます。これは、フォーカスが から に移動したためです。ただし、フォーカスが失われていないにもかかわらず、クリックされた後にクリックされた場合にもトリガーされます。button3
button2
panel1
button3
button2
button1
panel2
WPFのフォーカスに関するMSDNのドキュメントを読んで、追加しようとしました:
Input.FocusManager.SetIsFocusScope(panel2, true)
しかし、これは実際に問題を悪化させました!現在、イベントは、実際にフォーカスを失ったときではなく、ある子から別のpanel2.LostFocus
子にフォーカスが移動したときにのみトリガーされます。panel2
panel2
望ましい効果を得るにはどうすればよいですか?