Xamarin.Form के LayoutOptions में क्या अंतर है, विशेष रूप से भरें और विस्तारित करें?


170

Xamarin.Forms में हर Viewदो गुण हैं HorizontalOptionsऔर VerticalOptions। दोनों प्रकार के हैं LayoutOptionsऔर निम्न में से एक मान हो सकता है:

  • LayoutOptions.Start
  • LayoutOptions.Center
  • LayoutOptions.End
  • LayoutOptions.Fill
  • LayoutOptions.StartAndExpand
  • LayoutOptions.CenterAndExpand
  • LayoutOptions.EndAndExpand
  • LayoutOptions.FillAndExpand

जाहिरा तौर पर यह माता-पिता के दृष्टिकोण पर दृश्य के संरेखण को नियंत्रित करता है। लेकिन वास्तव में प्रत्येक व्यक्तिगत विकल्प का व्यवहार कैसा है? और Fillप्रत्यय में क्या अंतर है Expand?

जवाबों:


335

संक्षिप्त जवाब

Start, Center, Endऔर Fillदृश्य के परिभाषित अपने अंतरिक्ष के भीतर संरेखण

Expandपरिभाषित करता है कि क्या यह उपलब्ध होने पर अधिक जगह घेरता है।

सिद्धांत

संरचना LayoutOptions दो अलग-अलग व्यवहारों को नियंत्रित करती है:

  1. संरेखण: पैरेंट दृश्य के भीतर दृश्य को कैसे संरेखित किया जाता है?

    • Start: ऊर्ध्वाधर संरेखण के लिए दृश्य को शीर्ष पर ले जाया जाता है। क्षैतिज संरेखण के लिए यह आमतौर पर बाएं हाथ की ओर होता है। (लेकिन ध्यान दें, कि दाएं-से-बाएं भाषा सेटिंग वाले डिवाइस पर यह दूसरा तरीका है, यानी दाएं संरेखित।)
    • Center: दृश्य केंद्रित है।
    • End: आमतौर पर दृश्य नीचे या दाएं संरेखित होता है। (दाएं-से-बाएं भाषाओं पर, निश्चित रूप से, बाईं ओर संरेखित।)
    • Fill: यह संरेखण थोड़ा अलग है। दृश्य पैरेंट दृश्य के पूर्ण आकार में फैल जाएगा।

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

  2. विस्तार: क्या तत्व उपलब्ध होने पर अधिक स्थान घेरेंगे?

    • प्रत्यय Expand: यदि माता-पिता का दृष्टिकोण अपने सभी बच्चों के संयुक्त आकार से बड़ा है, अर्थात अतिरिक्त स्थान उपलब्ध है, तो उस प्रत्यय के साथ बच्चे के विचारों के बीच स्थान का अनुपात होता है। वे बच्चे अपने स्थान पर "कब्जा" करेंगे, लेकिन जरूरी नहीं कि इसे "भरें"। हम नीचे दिए गए उदाहरण में इस व्यवहार पर एक नज़र डालेंगे।
    • कोई प्रत्यय नहीं: प्रत्यय रहित बच्चों को Expandअतिरिक्त स्थान नहीं मिलेगा, भले ही अधिक स्थान उपलब्ध हो।

    फिर, यदि माता-पिता का दृष्टिकोण अपने बच्चों से बड़ा नहीं है, तो विस्तार प्रत्यय से भी कोई फर्क नहीं पड़ता है।

उदाहरण

आइए सभी आठ लेआउट विकल्पों के बीच अंतर को देखने के लिए निम्न उदाहरण पर एक नज़र डालें।

ऐप में StackLayoutआठ नेस्टेड सफेद बटन के साथ एक गहरा ग्रे है , जिनमें से प्रत्येक को इसके ऊर्ध्वाधर लेआउट विकल्प के साथ लेबल किया गया है। बटन में से किसी एक पर क्लिक करने पर, यह स्टैक लेआउट के लिए अपने वर्टिकल लेआउट विकल्प को असाइन करता है। इस तरह हम माता-पिता के साथ, विभिन्न लेआउट विकल्प के साथ विचारों की बातचीत को आसानी से परख सकते हैं।

(कोड की अंतिम कुछ पंक्तियाँ अतिरिक्त पीले बॉक्स जोड़ती हैं। हम एक पल में वापस आ जाएंगे।)

public static class App
{
    static readonly StackLayout stackLayout = new StackLayout {
        BackgroundColor = Color.Gray,
        VerticalOptions = LayoutOptions.Start,
        Spacing = 2,
        Padding = 2,
    };

    public static Page GetMainPage()
    {
        AddButton("Start", LayoutOptions.Start);
        AddButton("Center", LayoutOptions.Center);
        AddButton("End", LayoutOptions.End);
        AddButton("Fill", LayoutOptions.Fill);
        AddButton("StartAndExpand", LayoutOptions.StartAndExpand);
        AddButton("CenterAndExpand", LayoutOptions.CenterAndExpand);
        AddButton("EndAndExpand", LayoutOptions.EndAndExpand);
        AddButton("FillAndExpand", LayoutOptions.FillAndExpand);

        return new NavigationPage(new ContentPage {
            Content = stackLayout,
        });
    }

    static void AddButton(string text, LayoutOptions verticalOptions)
    {
        stackLayout.Children.Add(new Button {
            Text = text,
            BackgroundColor = Color.White,
            VerticalOptions = verticalOptions,
            HeightRequest = 20,
            Command = new Command(() => {
                stackLayout.VerticalOptions = verticalOptions;
                (stackLayout.ParentView as Page).Title = "StackLayout: " + text;
            }),
        });
        stackLayout.Children.Add(new BoxView {
            HeightRequest = 1,
            Color = Color.Yellow,
        });
    }
}

निम्न स्क्रीनशॉट आठ में से प्रत्येक बटन पर क्लिक करने पर परिणाम दिखाते हैं। हम निम्नलिखित अवलोकन करते हैं:

  • जब तक माता-पिता stackLayoutतंग होते हैं ( Fillपृष्ठ नहीं होता है ), प्रत्येक का ऊर्ध्वाधर लेआउट विकल्पButton का नगण्य है।
  • ऊर्ध्वाधर लेआउट विकल्प केवल तभी मायने रखता है जब stackLayoutबड़ा हो (जैसे Fillसंरेखण के माध्यम से ) और व्यक्तिगत बटन में Expandप्रत्यय होता है।
  • Expandप्रत्यय के साथ सभी बटनों के बीच अतिरिक्त स्थान है । इसे और स्पष्ट रूप से देखने के लिए हमने हर दो पड़ोसी बटनों के बीच पीले रंग की क्षैतिज रेखाएँ जोड़ीं।
  • उनकी अनुरोधित ऊंचाई से अधिक स्थान वाले बटन जरूरी नहीं कि इसे "भरें"। इस मामले में वास्तविक व्यवहार उनके संरेखण द्वारा नियंत्रित किया जाता है। उदाहरण के लिए, वे या तो अपने स्थान के शीर्ष, केंद्र या बटन पर संरेखित होते हैं या इसे पूरी तरह से भरते हैं।
  • सभी बटन लेआउट की पूरी चौड़ाई में फैले हुए हैं, क्योंकि हम केवल संशोधित करते हैं VerticalOptions

स्क्रीनशॉट

यहां आपको संबंधित उच्च-रिज़ॉल्यूशन स्क्रीनशॉट मिलते हैं।


6
छवि दिखती है [[मिडफिंग]], योग्य। बस मजाक कर रहा था यह वास्तव में उपयोगी था
जोय रेक्स

1
@JoyRex: ठीक है, शायद यह संस्करण थोड़ा कम भ्रमित करने वाला है। ;)
फाल्को

2
मैंने उपरोक्त आउटपुट के साथ भ्रमित किया है। start & startAndExpand दोनों एक ही आउटपुट हैं .. इनमें क्या अंतर है? यदि संभव हो तो आप स्पष्टीकरण दे सकते हैं ..
रंजीथ कुमार

1
FillAndExpandयह है कि आप क्या चाहते हैं, 99% समय के लिए
स्टीफन डेलक्रॉक्स

1
@ रंजीथकुमार वे ही हैं। यह StackLayout दूसरे माता-पिता में निहित था, फिर इसके FillAndExpand में अंतर हो सकता है - यह अपने माता-पिता के भीतर विस्तार करेगा ।
मिहा मार्किक

16

Xamarin.Forms के वर्तमान संस्करण में एक बग का एक सा है; शायद यह वहाँ एक समय हो गया है।

CenterAndExpand आम तौर पर विस्तार नहीं होता है, और इसके आसपास काम करना भ्रामक हो सकता है।

उदाहरण के लिए, यदि आपके पास एक StackLayoutसेट है CenterAndExpand, तो आप एक लेबल लगाते हैं, जो आपके लिए भी सेट CenterAndExpandहोता है, एक ऐसे लेबल की अपेक्षा करता है जिसकी चौड़ाई पूरी हो StackLayout। नहीं। इसका विस्तार नहीं होगा। आपको नेस्टेड लेबल ऑब्जेक्ट को पूरी चौड़ाई में विस्तारित करने के StackLayoutलिए " FillAndExpand" सेट करना है StackLayout, फिर लेबल को टेक्स्ट को केंद्र में बताएं, न कि खुद को ऑब्जेक्ट के रूप में HorizontalTextAlignment="Center"। मेरे अनुभव में आपको माता-पिता और नेस्टेड बच्चे दोनों की आवश्यकता है FillAndExpandयदि आप वास्तव में यह सुनिश्चित करना चाहते हैं कि यह फिट होने के लिए फैलता है।

        <StackLayout HorizontalOptions="FillAndExpand"
                     Orientation="Vertical"
                     WidthRequest="300">
            <Label BackgroundColor="{StaticResource TileAlerts}"
                   HorizontalOptions="FillAndExpand"
                   Style="{StaticResource LabelStyleReversedLrg}"
                   HorizontalTextAlignment="Center"
                   Text="Alerts" />

3
"... आप एक लेबल की उम्मीद करेंगे जो StackLayout की पूरी चौड़ाई है।" यह धारणा गलत है। Expandकेवल StackLayout के बच्चों के लिए उपयोग किया जाता है। इसलिए, यदि आपका StackLayout रूट है, या दूसरे StackLayout Expandमें नहीं है , तो इसका कोई प्रभाव नहीं है। इसके बजाय, फिल के अलावा कोई भी विकल्प आकार देने के लिए "रैप कंटेंट" के रूप में काम करेगा, जो कि आप देख रहे हैं।
तेरहलजोन

इसके अलावा, विस्तार केवल लेआउटऑक्शंस के लिए काम करता है जो स्टैकलैयूट के एक ही उन्मुखीकरण के हैं। इस मामले में, लेआउट "वर्टिकल" है, लेकिन प्रश्न में विकल्प क्षैतिज (विपरीत) हैं।
21

"एंडएक्सपैंड" शब्द अस्पष्ट है। इसकी व्याख्या "जितना संभव हो उतना विस्तार करें" या "केवल उतना ही विस्तार करें जितना आवश्यक हो"। मुझे लगता है कि माइक्रोसॉफ्ट, कुछ कम भ्रमित करने के लिए शर्तों को बदलने चाहिए "CenterAndExpandToParent" या "CenterAndExpandAsNeeded" की तरह
technoman23

1

फल्को ने एक अच्छी व्याख्या दी, लेकिन मैं उस पर एक और दृश्य के साथ जोड़ना चाहता था और ये टैग xaml में कैसे काम करते हैं, जो कि मैं ज्यादातर समय का उपयोग करना पसंद करता हूं। मैंने प्रदर्शन परिणामों के परीक्षण के लिए एक सरल परियोजना बनाई। यहाँ मुख्य पृष्ठ के लिए Xaml है:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Alignments.MainPage"
             BackgroundColor="White">


    <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" BackgroundColor="LightGray" Padding="1" Margin="30">
        <Label Text="Vert: EndAndExpand, Horz: EndAndExpand" VerticalOptions="EndAndExpand" HorizontalOptions="EndAndExpand" BackgroundColor="White"/>
    </StackLayout>


</ContentPage>

जैसा कि आप देख सकते हैं कि यह एक लेबल के साथ एक बहुत ही सरल StackLayout है। नीचे दी गई प्रत्येक छवि के लिए मैंने स्टैकलैट को समान रखा, मैंने अभी प्रवेश के लिए क्षैतिज और ऊर्ध्वाधर विकल्प बदले और चयनित विकल्पों को दिखाने के लिए पाठ को बदल दिया, ताकि आप देख सकें कि प्रवेश कैसे चलता है और आकार बदलता है।

प्रारंभ बनाम StartAndExpand यहाँ प्रारंभ के लिए उपयोग किया गया कोड है:

<Label Text="Vert: Start, Horz: Start" VerticalOptions="Start" HorizontalOptions="Start" BackgroundColor="White"/>

और StartAndExpand के लिए प्रयुक्त कोड:

<Label Text="Vert: StartAndExpand, Horz: StartAndExpand" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand" BackgroundColor="White"/>

जैसा कि आप देख सकते हैं कि StartAndExpand विकल्प में अधिक पाठ का उपयोग करने के अलावा कोई अंतर नहीं है। यह मेरे सैमसंग ए 30 भौतिक उपकरण पर परीक्षण किया गया था। ये अलग-अलग उपकरणों पर अलग-अलग प्रदर्शित हो सकते हैं, लेकिन मुझे लगता है कि यहाँ सभी चित्र सामूहिक रूप से दिखाते हैं कि ज़मरीन में कुछ कीड़े हैं। बाकी के लिए मैं सिर्फ स्क्रीनशॉट दिखाऊंगा, मुझे लगता है कि वे आत्म-व्याख्यात्मक हैं।

एंड बनाम एंडएंडएक्सपैंड

केंद्र बनाम केंद्रएंडएक्सपैंड

भरें बनाम FillAndExpand

मैं कुछ अतिरिक्त विवरणों के लिए Microsoft दस्तावेज़ पर एक नज़र डालने की भी सलाह देता हूं । उल्लेखनीय है कि "विस्तार केवल एक स्टैकलैयूट द्वारा उपयोग किया जाता है"।


अच्छा दृश्य। लेकिन मैं यह नहीं देखता कि यह Xamarin में कीड़े क्यों दिखाऊँ। यह भ्रामक हो सकता है कि लेबल उनकी सफेद पृष्ठभूमि (मेरे उदाहरण में ग्रे क्षेत्रों) की तुलना में अधिक स्थान पर कब्जा कर सकते हैं। तो एक "वर्टिकल सेंटर" लेबल उस स्थान के भीतर केंद्रित होता है जहां वह व्याप्त होता है - पूरे पृष्ठ के भीतर नहीं। जाहिर है, लगभग छह वर्षों के बाद यह विषय अभी भी उतना ही भ्रामक है जितना कि यह पीछे था।
फल्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.