2013-01-22 42 views
5

मैं 2 कॉलम के साथ एक मानक WPF ग्रिड के रूप में परिभाषित किया है:सीमा अधिकतम चौड़ाई

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" MinWidth="200" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    ... 
</Grid> 

क्या मैं हासिल करना चाहते हैं कि दूसरे स्तंभ के आधार पर स्वचालित आकार है इसके सामग्री और पहला कॉलम सभी शेष स्थान प्राप्त करता है। हालांकि मैं भी चाहता हूं कि पहले कॉलम में 200 पिक्सेल से कम न हो। समस्या यह है कि इस कॉन्फ़िगरेशन के साथ मेरा ऑटो कॉलम आकार बदलने के बजाए काटा जाएगा।

मैं वास्तव में क्या चाहता हूं कि डब्ल्यूपीएफ पहले कॉलम में 200 पिक्सेल असाइन करें, फिर शेष बचे हुए स्थान को ले जाएं और दूसरी कॉलम की सामग्री को शेष चौड़ाई के अधिकतम आकार प्रतिबंध के साथ आकार में पूछें। यदि सामग्री को कम जगह की आवश्यकता है, तो उसे शेष स्थान को पहले कॉलम पर असाइन करना चाहिए (इसे 200 पिक्सेल से बड़ा बनाना)।

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

क्या डिफ़ॉल्ट WPF नियंत्रणों के साथ इसे प्राप्त करने का कोई तरीका है या क्या मुझे इसके लिए अपना स्वयं का ग्रिड लिखना है?

उत्तर

1

एकमात्र बार मैंने कॉलम दो को काट दिया था जब कॉलम 2 + 200 की चौड़ाई ग्रिड की चौड़ाई से अधिक थी। मैं चारों ओर खेला और हो सकता है यह आपके लिए एक समाधान है:

<Grid Height="200" 
     Width="600"> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="*" 
         MinWidth="200" /> 
    <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Blue" 
      Grid.Column="0" /> 
    <Viewbox Grid.Column="1" 
      Stretch="Uniform" 
      MaxWidth="400"> 
    <Border Background="Yellow" 
      BorderBrush="Red" 
      BorderThickness="4" 
      Height="200" 
      Width="300" /> 
    </Viewbox> 
</Grid> 

मैं <ColumnDefinition Width="Auto" MaxWidth="400"/> लेखन की कोशिश की लेकिन maxwidth तो कोई प्रभाव नहीं पड़ा।

व्यूबॉक्स के लिए मैक्सविड्थ की कुल चौड़ाई के रूप में गणना की जाती है - आरक्षित 200 यदि यह स्पष्ट नहीं है।

+0

सवाल तो यह है: के बाद से मैं पहले (600) कुल चौड़ाई पता नहीं है के रूप में यह विंडोज़ आकार से निर्धारित होता है, मैं कैसे ग्रिड के लिए MaxWidth गणना करते हैं? मुझे लगता है कि मैं इसके लिए एक कनवर्टर लिख सकता हूं, लेकिन यदि अधिक प्रत्यक्ष तरीका है तो यह बहुत अच्छा होगा ... – aKzenT

+0

मुझे नहीं पता लेकिन मैं इस प्रश्न का पालन करूंगा। अगर आपको लगता है कि यह बेहतर जवाब पाने का मौका देता है तो मैं हटा सकता हूं। मुझे कन्वर्टर्स को भी पसंद नहीं है। –

+0

कृपया उत्तर हटाएं। मुझे लगता है कि मुझे पहले से ही एक विचार है कि आपके संस्करण के आधार पर कनवर्टर्स के बिना इसे कैसे हल किया जाए। – aKzenT

2

ऐसा लगता है कि आप मूल रूप से अपने दूसरे कॉलम के लिए 2 अलग-अलग मोड हैं। जब पूरी छवि को इसकी वर्तमान ऊंचाई पर प्रदर्शित करने के लिए पर्याप्त जगह होती है तो यह ऑटो होना चाहिए, अन्यथा इसे पहले कॉलम के लिए 200 लेने के बाद शेष स्थान शेष होना चाहिए। इस तरह के मोड-स्विचिंग करने के लिए आप एक कनवर्टर का उपयोग कर सकते हैं और अपने कॉलम के लिए चौड़ाई बांध सकते हैं।

यहां आपके पास 2 बुनियादी इनपुट हैं: कुल आकार ग्रिड के लिए उपलब्ध है, और छवि की वांछित चौड़ाई। चूंकि आपको उनकी आवश्यकता है, इसलिए आपको एक IMultiValueConverter की आवश्यकता होगी।

public class AutoColumnConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     double imageWidth = values.OfType<double>().FirstOrDefault(); 
     double gridWidth = values.OfType<double>().ElementAtOrDefault(1); 
     int minWidth = System.Convert.ToInt32(parameter); 

     double availableSpace = gridWidth - minWidth; 
     if (imageWidth > availableSpace) 
      return new GridLength(availableSpace, GridUnitType.Pixel); 

     return new GridLength(0, GridUnitType.Auto); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

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

<Border> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" MinWidth="200" /> 
      <ColumnDefinition> 
       <ColumnDefinition.Width> 
        <MultiBinding ConverterParameter="200"> 
         <MultiBinding.Converter> 
          <local:AutoColumnConverter/> 
         </MultiBinding.Converter> 
         <Binding ElementName="Img" Path="Source.Width"/> 
         <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Border}}" Path="ActualWidth"/> 
        </MultiBinding> 
       </ColumnDefinition.Width> 
      </ColumnDefinition> 
     </Grid.ColumnDefinitions> 

     <Image x:Name="Img" Grid.Column="1" Stretch="Uniform" StretchDirection="DownOnly" 
       Source="..."/> 
    </Grid> 
</Border> 
+3

मुझे लगता है कि यह काम करेगा, लेकिन ईमानदार हो मैं वास्तव में डब्ल्यूपीएफ में हजारों कनवर्टर लिखने के थक गया हूँ। मैं बॉक्स से बाहर कुछ की उम्मीद कर रहा था। – aKzenT