उपलब्ध स्थान को भरने के लिए WPF में नियंत्रण कैसे प्राप्त करें?


303

Buttonयदि आप उस ऊंचाई को निर्दिष्ट नहीं करते हैं तो कुछ WPF नियंत्रण (जैसे ) अपने 'कंटेनर में सभी उपलब्ध स्थान को खुशी से उपभोग करते हैं।

और कुछ, जैसे मुझे अभी उपयोग करने की आवश्यकता है, (बहुस्तरीय) TextBoxऔर ListBoxउनकी सामग्री को फिट करने के लिए आवश्यक स्थान लेने के बारे में अधिक चिंतित लगते हैं, और नहीं।

यदि आप इन लोगों को एक सेल में रखते हैं UniformGrid, तो वे उपलब्ध स्थान को फिट करने के लिए विस्तार करेंगे। हालांकि, UniformGridउदाहरण सभी स्थितियों के लिए सही नहीं हैं। क्या होगा यदि आपके पास स्वयं और अन्य * पंक्तियों के बीच की ऊँचाई को विभाजित करने के लिए * ऊंचाई पर सेट कुछ पंक्तियों के साथ एक ग्रिड है? यदि आपके पास एक है StackPanelऔर आपके पास ए Label, ए Listऔर ए है Button, तो आप लेबल और बटन द्वारा नहीं खाए गए सभी स्थान को लेने के लिए सूची कैसे प्राप्त कर सकते हैं?

मुझे लगता है कि यह वास्तव में एक बुनियादी लेआउट की आवश्यकता होगी, लेकिन मैं यह पता नहीं लगा सकता कि उन्हें उस स्थान को भरने के लिए कैसे प्राप्त किया जा सकता है जिसे वे डाल सकते हैं DockPanelऔर उन्हें भरने के लिए सेट करना भी काम नहीं करता है, ऐसा लगता है, क्योंकि DockPanelकेवल अंतरिक्ष अपनी 'subcontrols द्वारा आवश्यक) लेता है।

एक आकार बदलने योग्य जीयूआई काफी भयानक हो सकता है अगर आप के साथ खेलने के लिए किया था Height, Width, MinHeight, MinWidthआदि

क्या आप अपने कब्जे वाले ग्रिड सेल में अपने Heightऔर Widthगुणों को बांध सकते हैं ? या ऐसा करने का एक और तरीका है?


1
यूनिफॉर्मग्रिड अद्भुत है, मेरा नया डिफ़ॉल्ट गोटो टैग। मुझे स्टैकपैनल्स सादगी पसंद है (मुझे एक डिव की याद दिलाती है) लेकिन यूनिफ़ॉर्म ग्रिड ठीक वही करता है जो मुझे चाहिए।
टेरेंस

पुन: वर्दी। यूनिफार्म पर जोर दिया गया है। लगता है कि आप स्तंभ की चौड़ाई को समायोजित नहीं कर सकते हैं कोई पंक्ति ऊँचाई नहीं। यह केवल तभी उपयुक्त है जब सामग्री का प्रत्येक टुकड़ा समान आकार का हो। मैंने अपने StackPanel को एक ग्रिड के साथ बदल दिया, और Stretch ने तब काम किया जैसा कि मुझे उम्मीद थी।
pdschuller

इस लेख ने मुझे टेक्स्टबॉक्स में खिंचाव में मदद की।
jpaugh

जवाबों:


162

Panelलागू किए गए प्रत्येक नियंत्रण को अलग-अलग लेआउट तर्क से निष्पादित किया जाता है Measure()और Arrange():

  • Measure() पैनल और उसके प्रत्येक बच्चे का आकार निर्धारित करता है
  • Arrange() आयत निर्धारित करता है जहां प्रत्येक नियंत्रण प्रदान करता है

DockPanelशेष स्थान को अंतिम बच्चा भरता है। आप LastChildसंपत्ति सेट करके इस व्यवहार को अक्षम कर सकते हैं false

StackPanelअपने इच्छित आकार के लिए प्रत्येक बच्चे पूछते हैं और फिर उन्हें स्टैक्स। स्टैक पैनल Measure()प्रत्येक बच्चे पर उपलब्ध आकार के साथ कॉल Infinityकरता है और फिर बच्चे के वांछित आकार का उपयोग करता है।

एक Gridपर है सभी उपलब्ध अंतरिक्ष, तथापि, यह प्रत्येक बच्चे को अपने इच्छित आकार करने के लिए सेट और फिर उन्हें सेल में केंद्रित हो जाएगा।

आप अपने स्वयं के लेआउट तर्क को लागू कर सकते हैं Panelऔर फिर ओवरराइडिंग MeasureOverride()और ArrangeOverride()

एक सरल उदाहरण के लिए इस लेख को देखें ।


8
लिंक अब मर चुका है
user3690202

6
@ user3690202 Archive.org आपका मित्र है। लिंक को फिर से जोड़ा गया।
रफिन

4
विषय अभी भी MSDN में मौजूद है, लेकिन लिंक इसे बदल दिया गया: docs.microsoft.com/en-us/dotnet/framework/wpf/controls/…
Andrea Antonangeli

2
The last child of the DockPanel fills the remaining space: यह मेरी समझ से गायब कुंजी थी। मैं हमेशा यद्यपि स्पष्ट डॉक के बिना तत्व अंतरिक्ष भरा।
देखा गया

238

ऐसी कुछ संपत्तियाँ भी हैं जिन्हें आप अपने उपलब्ध स्थान को भरने के लिए एक नियंत्रण के लिए बाध्य कर सकते हैं जब वह ऐसा नहीं करेगी। उदाहरण के लिए, आप कह सकते हैं:

HorizontalContentAlignment="Stretch"

... एक नियंत्रण की सामग्री को क्षैतिज रूप से फैलाने के लिए मजबूर करने के लिए। या आप कह सकते हैं:

HorizontalAlignment="Stretch"

... नियंत्रण को अपने माता-पिता को भरने के लिए क्षैतिज रूप से फैलाने के लिए मजबूर करना।


88
इन सभी मामलों में उल्लिखित सबसे कुख्यात पैनल स्टैकपैनल है। इसमें ContentAlignment गुण शामिल नहीं हैं और अपने बच्चों को स्ट्रेच पर सेट करने से स्टार-आकार के ग्रिड के अंदर कोई प्रभाव नहीं पड़ेगा। अधिक निराश। यह लगभग वैसा ही है जैसे कि StackPanel पहला कंटेनर था जिसे WPF टीम ने लिखा था और यह मामला होने के लिए ग्रस्त है।
ब्रेंट स्कोली

4
@ बेंट - आह! मैं अपने स्टैम्पपेल की सामग्री को सही ढंग से भरने की कोशिश कर रहा हूं। धन्यवाद! मुझे लगा कि यह सिर्फ कुछ है जो मैं बहुत गलत कर रहा था।
एशले ग्रेनन

8
@townsean ढेर पैनल बहुत ही सीमित है, आप के लिए 0 एक UniformGrid का उपयोग कर खींच और या तो पंक्तियों या स्तंभों स्थापित करने के साथ समान व्यवहार प्राप्त कर सकते हैं
ForbesLindesay

2
@ Tuskan360 यूनिफ़ॉर्मग्रिड केवल कोशिकाओं को समान आकार की अनुमति देता है। मैं अंत में एक ग्रिड का इस्तेमाल किया, काम करने लगता है। कैसे StackPanel क्या यह प्रतीत होता है के लिए डिज़ाइन किया गया नहीं है कष्टप्रद।
तारकडाल

4
@TarkaDaal yeh, यूनिफ़ॉर्मग्रिड यदि सब कुछ समान आकार का है, तो ग्रिड यदि आप जटिल सापेक्ष आकार निर्दिष्ट करना चाहते हैं, तो सामग्री के आधार पर सिर्फ आकार के लिए स्टैक पैनल और उपेक्षा करें कि कितना स्थान उपलब्ध है।
फोर्ब्स लिंडसे

18

ठीक है, मैंने इसे पोस्ट करने के तुरंत बाद खुद को समझ लिया, जो सबसे शर्मनाक तरीका है। :)

ऐसा लगता है कि एक StackPanel के प्रत्येक सदस्य को बस अपने न्यूनतम अनुरोध के आकार को भरना होगा।

DockPanel में, मैंने गलत क्रम में चीजों को डॉक किया था। यदि पाठ बॉक्स या सूची बॉक्स संरेखण के बिना एकमात्र डॉक किया गया आइटम है, या यदि वे अंतिम जोड़े जाते हैं, तो वे शेष स्थान को वैसा ही भर देंगे जैसा वह चाहते थे।

मैं इसे संभालने का एक और अधिक सुंदर तरीका देखना पसंद करूंगा, लेकिन यह होगा।


मैं बस (इस पुराने सवाल पर!) इंगित करना चाहता हूं कि "बिना संरेखण के" यहां एक महत्वपूर्ण वाक्यांश है, कम से कम मेरे लिए यह था।
माइकबाज

4

क्षैतिज क्षैतिजकरण और कार्यक्षेत्र लेआउट लेआउट गुणों का उपयोग करें । वे नियंत्रित करते हैं कि कोई तत्व अपने माता-पिता के अंदर उस स्थान का उपयोग कैसे करता है जब तत्व द्वारा आवश्यक से अधिक कमरा उपलब्ध होता है।

एक StackPanel की चौड़ाई, उदाहरण के लिए, चौड़े तत्व के रूप में चौड़ी होगी। तो, सभी संकरे तत्वों में थोड़ा अतिरिक्त स्थान होता है। संरेखण गुण नियंत्रण करते हैं कि बच्चा तत्व अतिरिक्त स्थान के साथ क्या करता है।

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


31
यदि यह हमेशा सच होता, तो मूल प्रश्न नहीं पूछा जाता। उदाहरण के लिए, एक लेबल और एक पाठ बॉक्स के साथ एक क्षैतिज StackPanel। टेक्स्टबॉक्स के दाईं ओर अतिरिक्त स्थान है। TextBox ऑटो चौड़ाई पर सेट है। क्षैतिज क्षैतिजकरण के लिए स्ट्रेच सेट करने से टेक्स्टबॉक्स शेष स्थान को नहीं भरेगा।
ब्रेंट शाओली

कुछ भी हमेशा सच नहीं होता है, लेकिन यह जवाब मेरी जरूरतों के लिए काम करता है: डॉकपैनल, इमेज।
एलेरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.