2012-05-04 13 views
6

मैं कोड में कैसे एक कंटेनर, या केंद्रित बच्चे के तार्किक फोकस को परिभाषित कर सकता हूं, बिना कीबोर्ड फोकस दे रहा है?कुंजीपटल फोकस दिए बिना तार्किक फोकस कैसे सेट करें?

मैं सिर्फ यह नियंत्रित करना चाहता हूं कि कौन सा बच्चा फोकस प्राप्त करेगा जब नियंत्रण टैब कुंजी के माध्यम से फोकस करेगा या उस कंटेनर के हिस्से पर क्लिक करेगा जो बच्चे को मारता नहीं है, लेकिन इसे वास्तविक (यदि चोरी) वास्तविक फोकस नहीं देता है पहले से ही यह नहीं है।

और मैं यह भी चाहता हूं कि एक कीबोर्ड जेस्चर के माध्यम से एक विशिष्ट बच्चे का चयन करना या माउस के साथ उस पर क्लिक करना अभी भी संभव है।

मैं कीबोर्ड फोकस और लॉजिकल फोकस के बीच डब्ल्यूपीएफ में अंतर को समझता हूं, और तथ्य यह है कि एक तत्व के लिए, कीबोर्ड फोकस होने का तात्कालिक ध्यान भी है, लेकिन तार्किक फोकस होने से यह संकेत नहीं मिलता है कि तत्व में कीबोर्ड फोकस है।

मैं संलग्न संपत्ति को भी समझता हूं FocusManager.FocusedElement परिभाषित करता है कि इस तत्व को परिभाषित करने वाले तत्व पर शुरू होने वाले दृश्य पेड़ में कौन सा तत्व तार्किक फोकस है।

मैंने महसूस किया है कि इस संपत्ति नहीं किया जाता है केवल जब FocusManager.IsFocusScope सच करने के लिए, लेकिन यह भी GroupBox ऐसे के रूप में कंटेनरों के लिए निर्धारित है।

मैं कई प्रयास, खोजों के टन और WPF फोकस विषय पर पढ़ने कर दिया है, लेकिन कोई सफलता अब तक के साथ, मुझे समझ नहीं आता कि मैं क्या याद कर रहा हूँ:

  • कॉलिंग FocusManager.SetFocusedElement भी कीबोर्ड देते हैं, और यह मैं अस्थायी रूप से बस से पहले बहुत पहले समय के गलत पर मेरे बच्चे तत्व की संपत्ति फ़ोकस करने योग्य बदलाव होने पर कोई भी बच्चा से पहले ध्यान दिया था कि यह केवल काम करता है, नहीं, बल्कि बाद एक बच्चे पर GotKeyboardFocus और PreviewGotKeyboardFocus ध्यान केंद्रित
  • घटनाओं हैंडलिंग मिला प्रारंभिक केंद्रित तत्व को ओवरराइड करने के लिए तत्व या कंटेनर या तो काम नहीं करता है, क्योंकि मैं यह नहीं बता सकता कि क्या फोकस माउस या कीबोर्ड के माध्यम से प्राप्त किया गया था, और क्या फोकस सीधे बच्चे के तत्व या अप्रत्यक्ष रूप से कंटेनर के माध्यम से सेट हो गया था।
  • एक उदाहरण मैं क्या हासिल करने की कोशिश कर रहा हूँ वर्णन करने के लिए: मैं radiobuttons का एक सरल समूह है, और मैं कोड जो विकल्प में गतिशील रूप से नियंत्रित करने के लिए ध्यान केंद्रित हो जाएगा जब उपयोगकर्ता "टैब" फोकस करने के लिए स्थानांतरित करने के लिए करना चाहते हैं यह ग्रुपबॉक्स (आमतौर पर वह विकल्प जिसमें isChecked=true है)।

    <GroupBox Header="Options" Name="myGroupBox" 
          KeyboardNavigation.TabNavigation="Once" 
          KeyboardNavigation. DirectionalNavigation="Cycle" > 
        <StackPanel> 
         <RadioButton GroupName="g1" Name="opt1" Content="Option _1"/> 
         <RadioButton GroupName="g1" Name="opt2" Content="Option _2"/> 
         <RadioButton GroupName="g1" Name="opt3" Content="Option _3"/> 
        </StackPanel> 
    </GroupBox> 
    

    एक अंतिम टिप्पणी, मुझे पता है कि पर शैलियों और टेम्पलेट्स के माध्यम से एक ListBox का उपयोग कर के विकल्प की एक गतिशील सूची लागू करने के लिए, डेटा संदर्भ की एक संपत्ति के लिए सूची का SelectedItem बंधन, और उसके बाद ListBoxItem बाँध के लिए आइटम टेम्पलेट में RadioButton की संपत्ति IsChecked IsSelcted अपनी मूल ListBoxItem की संपत्ति है, और यह काम करता है, लेकिन मेरी विशेष मामले के लिए, मैं टी की जरूरत है o मेरे रेडियोबूटन को सीधे मेरे डेटा संदर्भ के गुणों से बंधे रखें, मैं उन्हें एक ही समय में सूची की चयनित चयन संपत्ति से नहीं जोड़ सकता।

    +0

    FocusManager.IsFocusScope = GroupBox –

    +0

    के लिए सत्य सेट करने का प्रयास करें, महान प्रश्न, मैं अपने आप को इस उत्तर की खोज कर रहा हूं ... – Doug

    उत्तर

    1

    मुझे पता है कि यह एक पुराना सवाल है, लेकिन उम्मीद है कि यह उत्तर दूसरों को इसी तरह की समस्या से मदद करेगा।

    यदि मैं समस्या को सही ढंग से समझता हूं, तो आप ग्रुपबॉक्स पर FocusManager.IsFocusScope = "True" सेट करके वांछित व्यवहार प्राप्त कर सकते हैं, और रेडियोबटन के लिए एक ईवेंट हैंडलर को हुक अप कर सकते हैं। जांच की गई घटना जो प्रेषक को लॉजिकल फ़ोकस सेट करती है

    Xaml:

     <GroupBox Header="Options" Name="myGroupBox" 
           FocusManager.IsFocusScope="True" 
           RadioButton.Checked="MyGroupBox_OnChecked" 
           KeyboardNavigation.TabNavigation="Once" 
           KeyboardNavigation.DirectionalNavigation="Cycle"> 
         <StackPanel> 
          <RadioButton GroupName="g1" Name="opt1" Content="Option _1"/> 
          <RadioButton GroupName="g1" Name="opt2" Content="Option _2"/> 
          <RadioButton GroupName="g1" Name="opt3" Content="Option _3"/> 
         </StackPanel> 
        </GroupBox> 
    

    कोड के पीछे:

    private void MyGroupBox_OnChecked(object sender, RoutedEventArgs e) 
        { 
         var radioB = sender as RadioButton; 
         if (radioB != null) 
          FocusManager.SetFocusedElement(myGroupBox, radioB); 
        } 
    
    घटना के 210
    +0

    जैसा कि ओपी ने कहा था, फोकसमेनगर। नेटफोक्यूज्ड एलिमेंट * कभी-कभी * केवल तार्किक फोकस नहीं, कीबोर्ड फोकस भी देता है। http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.setfocusedelement(v=vs.110).aspx "और तत्व कुंजीपटल फोकस देने का प्रयास करेगा"। –

    संबंधित मुद्दे