2011-11-18 23 views
10

मेरा google और stackoverflow search-fu मुझे विफल कर दिया है, इसलिए मैं इस प्रश्न को समुदाय में प्रस्तुत करता हूं।स्टैकपैनल के अंदर ग्रिड: ऑटो और * अजीब तरीके से क्यों व्यवहार करते हैं?

(यह सभी, VS2010 और .NET 4.0 का उपयोग कर उत्पन्न होता है एक रिक्त डिफ़ॉल्ट WPF समाधान में)

निम्नलिखित XAML पर विचार करें:

<StackPanel Orientation="Horizontal"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="20"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
        Background="Red" Width="200"/> 
     <Border Name="aborder2" Background="Green"/> 

    </Grid> 
</StackPanel> 

क्या आप "aborder2" की चौड़ाई भविष्यवाणी हो सकता है?

यदि आपने "20 पिक्सल" अनुमान लगाया है, तो आप गलत होंगे। सही जवाब 110 पिक्सल है।

इस XAML पर विचार करें:

<StackPanel Orientation="Horizontal"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="20"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 

     <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
        Background="Red" Width="200"/> 
     <Border Name="aborder2" Background="Green"/> 

    </Grid> 
</StackPanel> 

क्या आप "aborder2" की चौड़ाई भविष्यवाणी होने के लिए?

यदि आपने 20 पिक्सेल या 110 पिक्सेल अनुमान लगाए हैं, तो आप गलत होंगे। सही जवाब 200 पिक्सल है।

मैं इसे समझ नहीं सकता और यह मुझे पागल कर रहा है। ऐसा लगता है कि उत्तर स्पष्ट होना चाहिए; स्पष्ट रूप से ऑटो-भरने वाले ग्रिड कॉलम और स्टैपपनेल के बीच कुछ बातचीत होती है जो ग्रिड को फिक्र करने का कारण बनती है। लेकिन ऐसा लगता है कि भावना नहीं है - जो भी नियम इस व्यवहार को नियंत्रित कर रहे हैं वह मनमाने ढंग से प्रतीत होता है। 110 पिक्सेल क्यों? 109 पिक्सल या 100 पिक्सेल क्यों नहीं? मैं समझूंगा कि ऑटो आकार का कॉलम पूरी तरह से या कुछ विस्तार करने में विफल रहा है, लेकिन निश्चित चौड़ाई कॉलम को यादृच्छिक रूप से इसकी चौड़ाई को अनदेखा करने के लिए मुझे डेवलपर का जला हुआ खोल खोल दिया गया है।

कोई भी मदद या मार्गदर्शक रोशनी की सराहना की जाएगी!

+0

के रूप में प्रस्तुत करने के लिए मजबूर करने के लिए स्तंभ 1 क्यों aborder2 एक Grid.Column नहीं मिलता है निर्धारित कर सकते हैं? – 0x4f3759df

+0

मैंने इसे एक में रखना नहीं सोचा था क्योंकि इसे कॉलम 0 पर डिफ़ॉल्ट होना चाहिए। मैंने अभी इसका परीक्षण किया है और कॉलम को स्पष्ट रूप से सेट करने में कोई फर्क नहीं पड़ता है। – pfw

+0

आपके लिए उत्तर है लेकिन मुझे पहले घर पर जाना है –

उत्तर

3

मैं पता नहीं क्यों पहला उदाहरण सही ढंग से

2 क्योंकि Auto का अर्थ है "सामग्री के रूप में एक ही आकार" है प्रस्तुत नहीं हो रही है, लेकिन आपके पास कॉलम 2 में कुछ भी नहीं है इसलिए कॉलम 2 को प्रस्तुत किया जा रहा है 0px। आपके पास कॉलम 1 में कुछ है जो 2 कोशिकाओं को फैलाता है, लेकिन चूंकि कॉलम 2 को 0 पीएक्स पर प्रस्तुत किया जाता है, इसका मतलब है कि कॉलम 1 200 पीएक्स तक फैला हुआ है। डिफ़ॉल्ट रूप से, ग्रिड अपने बच्चों को सेल में सभी उपलब्ध स्थान भरने के लिए विस्तारित करता है, इसलिए यह aborder2 को 20p के बजाय 200px तक बढ़ा रहा है।

मुझे लगता है कि पहला उदाहरण एक समान स्थिति हो सकता है, जहां कॉलम 2 0px पर प्रतिपादन कर रहा है क्योंकि इसमें कोई सामग्री नहीं है, हालांकि मुझे यकीन नहीं है कि यह 11012 की चौड़ाई के लिए aborder2 क्यों सेट कर रहा है। 110 (GridWidth/TotalColumns) + (1stColumnWidth/TotalColumns * NumberOfStarColumns) से आता है, इसलिए मुझे लगता है कि यह एक बग है।

एक तरफ ध्यान दें के रूप में, आप एक स्तंभ 1 के MaxWidth="20" हमेशा 20px

+1

ठीक है, कम से कम आपने 110px निर्धारित करने के लिए सूत्र प्राप्त किया है ताकि आप एक उत्थान जीत सकें! मुझे खुद कोई रिश्ता नहीं मिला। – pfw

+0

दूसरा कॉलम पहले उदाहरण में 90px पर नहीं, 0 नहीं है। पहला कॉलम 110 (110 + 90 = 200 'को' aborder1' को समायोजित करने के लिए प्रस्तुत करता है, हालांकि मुझे नहीं पता कि उन्हें इन आकारों में क्यों प्रदान किया जाता है), और 'aborder2' इसे भरने के लिए खींच रहा है। –

+0

दिलचस्प अवलोकन जो मैक्सविड्थ को आकार देने से रोकता है। –

1

आपके लिए कोई जवाब नहीं है, लेकिन ऐसा लगता है कि सिल्वरलाइट में भी ऐसा लगता है। मुझे लगता है कि व्यवस्थित करने और मापने में कुछ बग है। यदि आप सीमा के बजाय वहां पर कस्टम नियंत्रण डालते हैं और माप को ओवरराइड करते हैं और विधियों की व्यवस्था करते हैं तो आपको शायद क्या हो रहा है की एक बेहतर तस्वीर मिल जाएगी।

जहां 110 से, मेरा अनुमान है कि आता है के रहस्य को सुलझाने के लिए प्रयास करने के लिए (200 - 20)/2 + 20

संपादित करें: मैं कुछ अन्य सूत्रों की कोशिश की और इसे पकड़ नहीं किया था, लगता अधिक की तरह:

(200 + 20)/2