2012-11-23 39 views
6

के समूह से खोए गए फोकस का पता लगाएं मैं संपादन योग्य सामग्री वाले कोड का उपयोग कर एक जीयूआई बना रहा हूं। जब उपयोगकर्ता स्थिर प्रदर्शन पर क्लिक करता है तो नियंत्रण उस व्यक्ति के लिए बदल जाता है जो संपादन की अनुमति देता है। कुछ मामलों में, प्रदर्शन नियंत्रण (उदा। Label) ComboBox और TextBox जैसे नियंत्रण समूहों के लिए स्वैप किया गया है।डब्ल्यूपीएफ नियंत्रण

मैं यह जानना चाहता हूं कि संपादन के नियंत्रण के मेरे समूह से फोकस खो गया है ताकि इंटरफ़ेस से इंटरफ़ेस को वापस उस आइटम के प्रदर्शन प्रस्तुति में स्विच किया जा सके।

उदाहरण के लिए, मेरे पास Panel1(Panel2(Button1, Button2), Button3) जैसे पेड़ में एक जीयूआई हो सकता है और मैं यह जानना चाहता हूं कि Panel2 से फोकस कब खो गया है। मैं निम्नलिखित (एफ # कोड) की कोशिश की:

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 क्लिक किया गया था क्लिक किया जाता है, शुरू हो रहा है, क्योंकि ध्यान के रूप में button3 को panel1 से बाहर चले गए। हालांकि, यह भी ट्रिगर होता है जब button2button1 के बाद क्लिक किया गया था, भले ही panel2 कभी फोकस न हो।

WPF में ध्यान के बारे में MSDN प्रलेखीकरण पढ़ना मैं जोड़ने की कोशिश की:

Input.FocusManager.SetIsFocusScope(panel2, true) 

लेकिन यह वास्तव में समस्या बदतर बना दिया! अब panel2.LostFocus ईवेंट केवल तब ट्रिगर होता है जब panel2 के एक बच्चे से फोकस शिफ्ट होता है और जब panel2 वास्तव में फ़ोकस खो देता है।

मुझे वांछित प्रभाव कैसे प्राप्त करना चाहिए?

उत्तर

6

ट्विटर पर 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