2011-12-17 18 views
10

हमारे पास एक WPF .NET 4.0 सी # आधारित एप्लिकेशन है। हमने एक्सएमएल परिभाषाओं (एक्सएएमएल नहीं) से हमारे यूजर इंटरफेस का निर्माण किया, लेकिन नीचे यूआई पेश करने के लिए हम एक डब्ल्यूपीएफ का उपयोग करते हैं। वह रनटाइम पर है, हम अपनी एक्सएमएल परिभाषा के आधार पर डब्ल्यूपीएफ यूआई बनाते हैं।डब्ल्यूपीएफ टैब कुंजी नेविगेशन

हमें टैब नेविगेशन में कोई समस्या है। हमने टेक्स्ट और कॉम्बो बॉक्स नियंत्रण के लिए टैबस्टॉप, टैबइंडेक्स सेट किया है।
लेकिन टैब नेविगेशन काम नहीं कर रहा है। इस लेआउट के लिए टैब नेविगेशन कैसे काम करें?

enter image description here

+4

कैसे "एक बार" क्या आप इस इंटरफ़ेस के लिए कोड-बैक में अपने नियंत्रण के लिए TabIndex गुण सेट कर रहे हैं? काम करने के बारे में आपको और स्पष्ट होना चाहिए। कुछ कोड पोस्ट करें। – Bernard

+4

'काम नहीं कर रहे' से आपका क्या मतलब है? क्या यह है कि आपने टैब मारा लेकिन फोकस नहीं चलेगा '? या यह चलता है, लेकिन गलत चला जाता है? किस तरह से यह गलत है? –

+0

क्या आपने [कीबोर्ड नेविगेशन] (http://msdn.microsoft.com/en-us/library/aa969768.aspx#Keyboard_Navigation) कक्षा देखी है? – rfmodulator

उत्तर

8

आप या तो अपने Tree नियंत्रण, या StackPanel व्युत्पन्न नियंत्रण पर एक KeyboardNavigation.TabNavigation जुड़ी संपत्ति की स्थापना के मामले में आप अपने नीचे बटन भी एक टैब चक्र में भाग लेने के लिए चाहते हैं की कोशिश करनी चाहिए:

<controls:CustomStackPanel KeyboardNavigation.TabNavigation="Cycle"> 
<Tree> 
... 
</Tree> 
</controls:CustomStackPanel> 

आप पेड़ नियंत्रण के बाहर टैबबिंग की देखभाल करने के लिए KeyboardNavigation.TabNavigation के साथ, पेड़ नियंत्रण के अंदर टैब व्यवहार को नियंत्रित करने के लिए वर्तमान में उपयोग करने का प्रयास कर रहे कोड-बैक दृष्टिकोण को भी जोड़ सकते हैं।

29

डब्ल्यूपीएफ पूरे यूआई ट्री को एक टैब टैप के रूप में मानता है। यह छोटे क्षेत्रों में विभाजित नहीं है जैसे आप उम्मीद करेंगे। इसमें UserControls के अंदर नियंत्रण शामिल है।

उदाहरण के लिए, यदि आप

<StackPanel> 
    <TextBox Name="TextBox1" /> 
    <MyUserControl /> 
    <TextBox Name="TextBox3" /> 
</StackPanel> 

और MyUserControl था

<MyUserControl> 
    <TextBox Name="TextBox2" /> 
</MyUserControl> 

डिफ़ॉल्ट टैब चक्र TextBox1, TextBox2, TextBox3 होगा कैसा दिखता था। ऐसा इसलिए है क्योंकि कोई TabIndex गुण परिभाषित नहीं किए जाते हैं, इसलिए सभी नियंत्रण डिफ़ॉल्ट टैब ऑर्डर पर चलते हैं, यह वह क्रम है जिसमें वे UI में जोड़े जाते हैं।

आप इस तरह के नीचे के रूप में अपने नियंत्रण पर tabindex सेट करते हैं,

<StackPanel> 
    <TextBox Name="TextBox1" TabIndex="1" /> 
    <MyUserControl TabIndex="2" /> 
    <TextBox Name="TextBox3" TabIndex="3" /> 
</StackPanel> 

आपका tabbing TextBox1, TextBox3, TextBox2 लिए बदल जाएगा। ऐसा इसलिए है क्योंकि टेक्स्टबॉक्स 2 में एक टैबइंडेक्स निर्दिष्ट नहीं है, इसलिए डिफ़ॉल्ट माना जाता है और इसे निर्दिष्ट किए गए टैबइंडेक्स के साथ अन्य सभी नियंत्रणों के बाद टैबबड किया जाता है।

जिस तरह से मैं आमतौर पर इस बारे में मिलता हूं, उपयोगकर्ता नियंत्रण के अंदर UserControl के अंदर TabIndex को बाध्य करना है। TibIndex।

उदाहरण UserControl करने के लिए बाध्यकारी निम्नलिखित जोड़ने फिर

<MyUserControl> 
    <TextBox Name="TextBox2" TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}}" /> 
</MyUserControl> 

मैं आमतौर पर यह बाध्यकारी सेट करने के लिए याद करने के लिए इस UserControl के Loaded घटना में बाध्यकारी बजाय होने के सेट करने के लिए पसंद करते हैं टैब चक्र सही होगा के लिए UserControl के अंदर सभी नियंत्रणों पर। मुझे यकीन है कि यह करने के भी और अधिक कुशल तरीके हैं, हालांकि समस्या मेरे पास बैठने के लिए पर्याप्त नहीं हुई है और इस कार्यवाही से बचने के लिए टैब स्कॉप्स का सही तरीके से उपयोग करने के तरीके को शोधने के लिए समय निकाला है।

5

प्रति जवाब नहीं है लेकिन WPF टैबबिंग बेहद कमजोर है। Xaml में TabNavigation, IsTabStop गुणों को सेट करने और फोकस स्कोप के साथ चारों ओर झुकाव की आवश्यकता है। मैंने अकेले Xaml का उपयोग कर सही ढंग से टैबबिंग प्राप्त करने का प्रयास किया है। मैं आपके एक्सएमएल के साथ शुरू करने का सुझाव दूंगा -> डब्ल्यूपीएफ मॉडल वास्तव में एक्समएल होना चाहिए -> डब्ल्यूपीएफ!हालांकि मैं कल्पना करता हूं कि यह संभव नहीं है।

इसके बारे में एक कामकाज के लिए कैसे। क्या आपके लिए जेनरेट कोड में टैबबिंग को संभालना संभव है? यदि आपके डब्ल्यूपीएफ उपयोगकर्ता नियंत्रण आपके अपने एक्सएमएल से आपके स्वयं के एक्सएमएल से उत्पन्न होते हैं तो मैं आपके एक्सएमएल में एक टैबऑर्डर तत्व डालने का सुझाव देता हूं और उसके बाद टैबओट इवेंट को वायरस करने के लिए इसका उपयोग करता हूं। निम्नलिखित कोड नमूना पर

देखो कोड में एक कदम आपरेशन KeyUp (या PreviewKeyUp) अपने "tabbable" नियंत्रण की स्थिति में है और यदि कुंजी (Tabbing के समान)

// Creating a FocusNavigationDirection object to perform the tab operation 
// values include Next, Previous, First, Last etc... 
FocusNavigationDirection focusDirection = FocusNavigationDirection.Next; 

// MoveFocus takes a TraveralReqest as its argument. 
TraversalRequest request = new TraversalRequest(focusDirection); 

// Gets the element with keyboard focus. 
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement; 

// Change keyboard focus. 
if (elementWithFocus != null) 
{ 
    elementWithFocus.MoveFocus(request); 
} 

दूसरे तार मजबूर करने के लिए टैब को उपरोक्त कोड को अगले तत्व पर जाने के लिए फोकस करने के लिए कॉल किया गया था।

उपरोक्त कोड नमूना मूल रूप से कोड में बल देगा जो डब्ल्यूपीएफ को बॉक्स से बाहर करना चाहिए। के रूप में अन्य पोस्टर का सुझाव दिया है कि मैं क्या KeyboardNavigation.IsTabStop और KeyboardNavigation.TabNavigation

के मूल्यों

सादर देखने के लिए अपने उत्पन्न WPF कोड के माध्यम से जाना होगा,

+0

टैब को सामान्य रूप से सामान्य रूप से संभालने के बारे में सुनिश्चित नहीं है - यह थोड़ा हैकी लगता है। हालांकि MoveFocus सामान के लिए +1 - मुझे पता चला कि मुझे कस्टम नियंत्रण के लिए Shift + टैब को संभालने के लिए इसकी आवश्यकता है, जहां कुछ चीजें इसकी दृश्यता बदल रही थीं। –

0

प्रयास करें KeyboardNavigation.TabNavigation =

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