2012-06-21 16 views
5

संक्षेप में वर्णन करने के लिए यह प्रश्न कठिन है, इसलिए मेरे साथ भालू।डब्ल्यूपीएफ ग्रिड आकार

वर्तमान में मेरे पास दो पंक्तियों वाला ग्रिड है। पहली पंक्ति की ऊंचाई ऑटो है, और दूसरी पंक्ति की ऊंचाई * है, इसलिए जब मैं खिड़की का आकार बदलता हूं, तो दूसरी पंक्ति खिड़की के अनुसार बढ़ती और घट जाती है।

यह मूल लेआउट है:

____ ____ ____ 
    ->  -> 
____ ____ ____ 
       ____ 
     ____ 
____ 

मैं दूसरी पंक्ति के लिए 'न्यूनतम ऊंचाई' का एक तरह जोड़ना चाहते हैं:

<Window> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Border> 
      ... 
     </Border> 
     <Border Grid.Row="2"> 
      ... 
     </Border> 
    </Grid> 
</Window> 

यहाँ मौजूदा व्यवहार का एक गरीब स्केच है , ताकि जब मैं खिड़की को काफी छोटा आकार दे, तो दूसरी पंक्ति घटती रहती है, और पहली पंक्ति इसके बजाय घटती जा रही है।

वांछित व्यवहार:

____ ____ ____ 
    ->  -> ____ 
____ ____ 
       ____ 
     ____ 
____ 

वहाँ दूसरी पंक्ति के लिए न्यूनतम ऊंचाई मिलता है, और छोटा करने के लिए पहले एक मजबूर करने के लिए एक आसान तरीका है?

अधिक विवरण:

जब मैं दूसरी पंक्ति पर MinHeight निर्धारित करते हैं, यह सिर्फ क्लिप ग्रिड जब मैं यह है कि आकार के नीचे आकार बदलें।

पहली पंक्ति में नियंत्रण का आकार संकलन समय पर अज्ञात है, लेकिन रनटाइम पर जाना जाता है। यदि यह समाधान का एक आवश्यक हिस्सा है, तो मैं पंक्ति की मैक्सहेइट सेट कर सकता हूं, लेकिन अभी एक ऑटो ऊंचाई काम कर रही है।

दूसरी पंक्ति में नियंत्रणों का स्पष्ट आकार नहीं है। उन्हें आकार देने की अनुमति है, लेकिन मैं उन्हें वांछित न्यूनतम ऊंचाई से छोटे होने से रोकने की कोशिश कर रहा हूं।

उत्तर

7

पहली पंक्ति में नियंत्रण का आकार संकलन समय पर अज्ञात है, लेकिन रनटाइम पर जाना जाता है। यदि यह समाधान का एक आवश्यक हिस्सा है, तो मैं पंक्ति की मैक्सहेइट सेट कर सकता हूं, लेकिन अभी एक ऑटो ऊंचाई काम कर रही है।

मुझे लगता है कि यह शायद सबसे आसान समाधान होने जा रहा है। मैक्सहेइट को रनटाइम पर गणना मूल्य पर बाध्य करें:

<Grid.RowDefinitions> 
    <RowDefinition Height="*" MaxHeight="{Binding MyProperty}"/> 
    <RowDefinition Height="*" MinHeight="100"/> 
</Grid.RowDefinitions> 

संपादित करें: पिछला समाधान निकट है, लेकिन सही नहीं है। इधर, एक तरह से अपने वांछित परिणाम प्राप्त करने के लिए है लेकिन, यकीन नहीं अगर यह इष्टतम दृष्टिकोण है:

<Grid ShowGridLines="True" Name="myGrid"> 
    <Grid.Resources> 
     <local:RowHeightConverter x:Key="rowHeightConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Name="row1" MaxHeight="{Binding MyProperty}"> 
      <RowDefinition.Height> 
       <MultiBinding Converter="{StaticResource rowHeightConverter}"> 
        <Binding Path="ActualHeight" ElementName="row2" /> 
        <Binding Path="ActualHeight" ElementName="myGrid" /> 
        <Binding Path="MaxHeight" ElementName="row1" /> 
       </MultiBinding> 
      </RowDefinition.Height> 
     </RowDefinition> 
     <RowDefinition Name="row2" Height="*" MinHeight="300"/> 
    </Grid.RowDefinitions> 
</Grid> 

और अपने कनवर्टर:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    double row2Height = (double)values[0]; 
    double gridHeight = (double)values[1]; 
    double row1MaxHeight = (double)values[2]; 

    if (gridHeight - row2Height >= row1MaxHeight) 
    { 
     return gridHeight - row2Height; 
    } 

    return row1MaxHeight; 
} 
+0

काम नहीं करता। पहली पंक्ति की ऊंचाई ठीक तरह से व्यवहार करती है जैसे कि दूसरी पंक्ति में कोई मिनीहेइट नहीं था। यह खिड़की के रूप में केवल आधे आकार का आकार बदलता है। इससे दूसरी पंक्ति को फिसल जाना पड़ता है। –

+0

@ केंडलफ्रे पिछले समाधान सभी मामलों के लिए काम नहीं किया था इसलिए मैंने एक समाधान जोड़ा जो आपकी आवश्यकताओं को पूरा करना चाहिए। –

+0

मल्टीबाइंडिंग के लिए धन्यवाद। मुझे इसके बारे में पता नहीं था। एक सवाल: वास्तविक ग्रिड में कई अन्य निश्चित और ऑटो आकार की पंक्तियां हैं, इसलिए मुझे लगता है कि मुझे 'ग्रिड हाइट - पंक्ति 2height - row3height', आदि करना चाहिए? –

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