2012-01-05 17 views
7

लघु कहानी: फ़ोकस स्कोप के अंदर एक सूची बॉक्स किसी आइटम को चुनने की अनुमति नहीं देता है।फ़ोकस स्कोप के भीतर ListBox का उपयोग करें

लंबी कहानी:

मैं डेटा प्रविष्टि के लिए एक संदर्भ के प्रति संवेदनशील विजेट बनाने की कोशिश कर रहा हूँ। मेरे पास कई क्षेत्रों के साथ मुख्य पैनल है। इसके नीचे, मेरे पास FocusManager.FocusScope="True" वाला पैनल है। यह पैनल उस फ़ील्ड के लिए प्रासंगिक विजेट से भरा जाएगा जो वर्तमान में फ़ोकस कर रहा है। उदाहरण के लिए, दिनांक फ़ील्ड का चयन स्क्रीन के नीचे कैलेंडर दिखाएगा।

मेरे पास कई नियंत्रण हैं जिन्हें उपयोगकर्ता को सूची से कई मानों में से एक का चयन करने की आवश्यकता होती है। मैंने फोकसबॉक्स को फोकस स्कोप में रखा है, लेकिन मैं किसी भी आइटम का चयन नहीं कर सकता। जब कुछ चुना जाता है (प्रोग्रामेटिक रूप से) और आप ListBox पर क्लिक करते हैं, तो यह सब कुछ अचयनित करता है।

मैंने कुछ घटनाओं का परीक्षण किया, और यह माउसडाउन घटनाओं को नहीं उठा रहा है, लेकिन यह माउसमोव घटनाओं को उठा रहा है। जब भी मैं किसी आइटम पर क्लिक करता हूं तो यह गॉटफोकस को सक्रिय करता है, लेकिन यह कभी भी लॉस्टफोकस को नहीं चलाता है। मुझे यकीन नहीं है कि इसका क्या अर्थ है, लेकिन मुझे आशा है कि यह किसी को भी मददगार हो सकता है जो इसे पढ़ रहा है।

यहां कोड है जिसे मैं संदर्भ-संवेदनशील विजेट प्रदर्शित करने के लिए उपयोग कर रहा हूं।

<Grid x:Name="EntryWidget" FocusManager.IsFocusScope="True"> 
    <Grid.Resources> 
     <ListBox x:Key="List" ItemsSource="{Binding}" /> 
    </Grid.Resources> 
</Grid> 

मैं उपयोग Window.GotFocus घटना कराई, उचित नियंत्रण के लिए विजेट इस प्रकार अपडेट की तरह करने के लिए:

private void Window_GotFocus(object sender, RoutedEventArgs e) 
{ 
    FrameworkElement focus = (FrameworkElement)FocusManager.GetFocusedElement(this); 
    EntryWidget.Children.Clear(); // Could this be the culprit? 
    object tag = focus.Tag; 
    if (tag != null) 
    { 
     if (EntryWidget.Resources.Contains(tag)) 
     { 
      EntryWidget.Children.Add(EntryWidget.Resources[tag] as UIElement); 
     } 
    } 
} 

तो:

    मैं अपने विंडो में निम्नलिखित XAML है
  1. क्या फ़ोकसबॉक्स को फ़ोकस स्कोप के भीतर काम करने का कोई तरीका है?

  2. या कोई अन्य सूची नियंत्रण है जो फोकस स्कोप के अंदर बेहतर काम करता है?

  3. या क्या मैं फोकस स्कॉप्स का उपयोग कर गलत दृष्टिकोण ले रहा हूं? मेरी आवश्यकताएं: उपयोगकर्ता स्क्रॉल करने योग्य सूची से किसी आइटम का चयन करने में सक्षम होना चाहिए, जो वर्तमान फ़ील्ड में मान दर्ज करेगा। वर्तमान क्षेत्र फोकस खोना नहीं चाहिए।

+0

मुझे पूरा यकीन नहीं है कि आप क्या करने का प्रयास कर रहे हैं, लेकिन क्या आपने संग्रह दृश्यों को जोड़ने पर देखा है, यह तब होता है जब संग्रह का एक आइटम चुना जाता है, अन्य संग्रह स्वचालित रूप से अपडेट हो जाता है। यहां एमएसडीएन http://msdn.microsoft.com/en-us/library/system.windows.data.collectionview.aspx – mihajlv

+0

से एक लिंक है, मेरे पास केवल एक सूची बॉक्स है। जब कोई आइटम चुना जाता है, तो उसे उस टेक्स्टबॉक्स को अपडेट करना चाहिए जिसमें फोकस हो। लेकिन मैं किसी भी आइटम का चयन नहीं कर सकता। –

+0

इसके बारे में, यदि आपके पास एक प्रकार का टेक्स्टबॉक्स है जो टेक्स्टबॉक्स द्वारा अपडेट किया जाता है तो इसे फोकस हो जाता है, डीपी को स्वयं के बराबर सेट करता है। फिर जब आप किसी सूची पर क्लिक करते हैं, तो आप उस डीपी को अपडेट करते हैं जिसमें अंतिम तत्व का टेक्स्टबॉक्स होता है जिसमें फोकस होता है, मुझे पता है कि यह एक कामकाज है लेकिन इसे काम करना चाहिए। – mihajlv

उत्तर

1

जब आप सूची बॉक्स या उस आइटम पर क्लिक करते हैं, तो आप अपने एप्लिकेशन का कीबोर्ड फोकस सूचीबॉक्स पर सेट कर रहे हैं। यह आपके द्वारा परिभाषित फोकस स्कोपों ​​के बावजूद होता है।

यह ऊपरी पैनल के लिए ध्यान देने के दायरे (खेतों युक्त एक) को परिभाषित, और ऊपरी पैनल है, जो वास्तव में आइटम है कि में ध्यान केंद्रित किया गया था करने के लिए ध्यान केंद्रित करने के लिए सेट हो जाएगा ListBox के SelectionChanged सेट ध्यान केंद्रित किया जा सकता है किसी भी सूची बॉक्स आइटम से पहले उस पैनल पर क्लिक किया गया था।

<StackPanel> 
    <StackPanel x:Name="upperPanel" FocusManager.IsFocusScope="True" GotFocus="upperPanel_GotFocus"> 
     <TextBox x:Name="TextBox1"></TextBox> 
     <TextBox x:Name="TextBox2"></TextBox> 
    </StackPanel> 
    <StackPanel> 
     <ListBox x:Name="ListBox1" SelectionChanged="ListBox_SelectionChanged"> 
      <ListBoxItem>First</ListBoxItem> 
      <ListBoxItem>Second</ListBoxItem> 
      <ListBoxItem>Third</ListBoxItem> 
     </ListBox> 

     <ListBox x:Name="ListBox2" SelectionChanged="ListBox_SelectionChanged"> 
      <ListBoxItem>4</ListBoxItem> 
      <ListBoxItem>5</ListBoxItem> 
      <ListBoxItem>6</ListBoxItem> 
     </ListBox> 
    </StackPanel> 
</StackPanel> 

private IInputElement focusedElement = null; 

private void upperPanel_GotFocus(object sender, RoutedEventArgs e) 
{ 
    focusedElement = e.Source as IInputElement; 
} 

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    UpdateTextBoxValue((e.AddedItems[0] as ListBoxItem).Content.ToString()); 
} 

private void UpdateTextBoxValue(string text) 
{ 
    TextBox focusedTextBox = focusedElement as TextBox; 
    if (focusedTextBox != null) 
    { 
     focusedTextBox.Text = text; 
    } 

    upperPanel.Focus(); 
} 

upperPanel दायरे में वर्तमान में सक्रिय नियंत्रण GotFocus ईवेंट हैंडलर से अप-टू-डेट रखा जाता है, और UpdateTextBoxValue विधि सक्रिय TextBox नियंत्रण पर पाठ की स्थापना और फोकस करने के लिए वापस स्थापित करने के आरोप में है यह।

मुझे लगता है कि आप उन शर्तों से परिचित हैं जो मैं उपयोग कर रहा था (कीबोर्ड फोकस/तार्किक फोकस); यदि नहीं, तो आप Focus Overview पर एक नज़र डाल सकते हैं या आप बस पूछ सकते हैं।

+0

हम्म, हैक लगता है। मेरे पास सूची बॉक्स के अलावा कई नियंत्रण हैं जो अन्य क्षेत्रों के लिए प्रदर्शित किए जा सकते हैं। अगर मुझे उस नियंत्रण के लिए GetFocusedElement करना है जो मैं प्रदर्शित करना चाहता हूं, तो क्या कोई बेहतर तरीका है? आपने उल्लेख किया है कि यह सूची बॉक्स पर कीबोर्ड फोकस सेट कर रहा है। यदि ऐसा है, तो मुख्य फोकस दायरे में फ़ील्ड में एक कुंजी प्रकार क्यों दबा रहा है? सूची बॉक्स में कीबोर्ड फोकस नहीं लगता है। –

+0

@kendfrey मैंने अपना जवाब संपादित कर लिया है। यदि आप मेरे उदाहरण का जिक्र कर रहे हैं, तो टेक्स्टबॉक्स में एक प्रमुख प्रकार का टेक्स्ट दबाएं क्योंकि मैं कुंजीपटल को कोड से वापस फोकस कर रहा हूं। –

+0

क्या आपका 'केंद्रित एलीमेंट' फ़ील्ड फोकस स्कोप के उद्देश्य को हरा नहीं है? और मैं आपके कोड का जिक्र नहीं कर रहा हूं। मेरा कोड मुझे सूची (कीबोर्ड) को सूची बॉक्स पर केंद्रित नहीं करने देता है। मैं कोड पोस्ट करूंगा जो मुझे लगता है कि प्रासंगिक हो सकता है। –

2

मेरा उत्तर पर ध्यान केंद्रित करने के लिए का उपयोग नहीं करेगा।

आप फोकस के उद्देश्य को हराकर दयालु हैं। क्या होगा यदि कोई माउस का उपयोग नहीं कर सकता है और इसके बजाय कीबोर्ड का उपयोग करना चाहता है?

क्यों न केवल सूची में चयन है, फिर फोकस स्कॉप्स के साथ यह अतिरिक्त कार्य करने के बजाय, मूल नियंत्रण पर वापस ध्यान केंद्रित करें?

+0

अच्छा विचार। यह एप्लिकेशन एक टैबलेट पीसी के लिए डिज़ाइन किया गया है, इसलिए कीबोर्ड समर्थन उच्च प्राथमिकता नहीं है। लेकिन इस तरह की स्थिति के लिए डिजाइन किए गए फोकस स्कोप नहीं हैं? यह आपके स्वयं के फोकस सिस्टम को लागू करने के लिए बहुत काम करेगा, नहीं? –

+0

लेकिन यदि यह टैबलेट सिस्टम के लिए है, तो केवल स्पर्श के साथ, फोकस की आवश्यकता क्या है? यदि आप इसे * कीबोर्ड फोकस * के लिए उपयोग नहीं कर रहे हैं, तो मुझे यकीन नहीं है कि आप इसके लिए क्या उपयोग कर रहे हैं। –

+0

हम उपयोगकर्ता को अंततः सीधे टाइप करने दे सकते हैं। यदि मैं वर्तमान क्षेत्र का ट्रैक रखने के लिए फोकस का उपयोग नहीं करता, तो मैं तब क्या उपयोग करूंगा? फोकस संकेत, जैसे हाइलाइट किए गए टेक्स्टबॉक्स, सहायक होते हैं, और वर्तमान क्षेत्र की तुलना में कुछ अन्य नियंत्रणों पर ध्यान केंद्रित करने के लिए यह प्रति-अंतर्ज्ञानी होगा। और कृपया टैबलेट पर डेटा एंट्री करने की कोशिश करने के लिए मेरा फैसला न करें। :) :( –