2012-11-23 33 views
6

編集可能なコンテンツを持つコードを使用して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 

期待通りに焦点がpanel1button3の外に移動しているためbutton2は、クリックされた後button3がクリックされたときにpanel2.LostFocusイベントがトリガされます。ただし、panel2がフォーカスを失うことはありませんが、button1がクリックされた後にbutton2がクリックされたときにもトリガーされます。 WPFにフォーカスについてのMSDNドキュメントを読む

私が追加してみました:

Input.FocusManager.SetIsFocusScope(panel2, true) 

をが、これは実際には問題が悪化し!今度はpanel2.LostFocusイベントは、panel2の子から別の子にフォーカスが移動し、panel2が実際にフォーカスを失っていないときにのみトリガーされます。

希望の効果を得るにはどうすればよいですか?

答えて

6

TwitterのIan Voyceのおかげで、私はIsKeyboardFocusWithinChangedイベントを使用して必要な機能を得ることができました。ここにデモがあります:

open System.Windows 

let Button x = 
    Controls.Button(Content=x, Width=64.0, Margin=Thickness 3.0) 

let Panel ctrls = 
    let panel = Controls.StackPanel() 
    for ctrl in ctrls do 
    panel.Children.Add ctrl 
    |> ignore 
    panel 

let label = Controls.Label(Content="Edit 12") 
let button1 = Button "1" 
let button2 = Button "2" 
let button3 = Button "3" 

let panel = Panel[button1; button2] 

[<System.STAThreadAttribute>] 
do 
    label.HorizontalContentAlignment <- HorizontalAlignment.Center 
    label.MouseLeftButtonDown.Add(fun _ -> 
    label.Content <- panel) 
    panel.IsKeyboardFocusWithinChanged.Add(fun e -> 
    if not(unbox e.NewValue) then 
     label.Content <- "Edit 12") 
    Application().Run(Window(Content=Panel[label :> UIElement; button3 :> UIElement])) 
    |> ignore 
関連する問題