編集可能なコンテンツを持つコードを使用してGUIを構築しています。ユーザーが静的表示をクリックすると、コントロールは編集可能な状態にスワップアウトされます。場合によっては、ComboBox
およびTextBox
などのコントロールグループに対して、表示コントロール(たとえば、Label
)をスワップアウトすることがあります。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
期待通りに焦点がpanel1
button3
の外に移動しているためbutton2
は、クリックされた後button3
がクリックされたときにpanel2.LostFocus
イベントがトリガされます。ただし、panel2
がフォーカスを失うことはありませんが、button1
がクリックされた後にbutton2
がクリックされたときにもトリガーされます。 WPFにフォーカスについてのMSDNドキュメントを読む
私が追加してみました:
Input.FocusManager.SetIsFocusScope(panel2, true)
をが、これは実際には問題が悪化し!今度はpanel2.LostFocus
イベントは、panel2
の子から別の子にフォーカスが移動し、panel2
が実際にフォーカスを失っていないときにのみトリガーされます。
希望の効果を得るにはどうすればよいですか?