XAML

2008-09-17 25 views
7

में विंडो या स्क्रीन आकार के आधार पर ग्रिड कॉलम मैक्सविड्थ कैसे सेट करें मेरे पास पहले कॉलम पर ग्रिडस्प्लिटर वाली विंडो में 3 कॉलम ग्रिड है। मैं पहले कॉलम के मैक्सविड्थ को मूल विंडो के एक तिहाई या पृष्ठ Width (या ActualWidth) पर सेट करना चाहता हूं और यदि संभव हो तो मैं इसे XAML में करना पसंद करूंगा।XAML

यह कुछ नमूना एक्सएएमएल है जो XamlPad (या इसी तरह) में खेलने के लिए है जो दिखाता है कि मैं क्या कर रहा हूं।

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition x:Name="Column1" Width="200"/> 
      <ColumnDefinition x:Name="Column2" MinWidth="50" /> 
      <ColumnDefinition x:Name="Column3" Width="{ Binding ElementName=Column1, Path=Width }"/> 
      </Grid.ColumnDefinitions> 

     <Label Grid.Column="0" Background="Green" /> 
     <GridSplitter Grid.Column="0" Width="5" /> 
     <Label Grid.Column="1" Background="Yellow" /> 
     <Label Grid.Column="2" Background="Red" /> 
    </Grid> 
</Page> 

आप देख सकते हैं, सही स्तंभ चौड़ाई पहले कॉलम की चौड़ाई के लिए बाध्य है, इसलिए जब आप विभाजक का उपयोग कर बाएँ स्तंभ स्लाइड, अधिकार स्तम्भ आप स्लाइड तो एक ही :) करता है बाईं ओर बाएं कॉलम, आखिरकार यह आधा पृष्ठ/खिड़की और खिड़की के दाहिने तरफ स्लाइड करेगा, कॉलम 2 और 3 को धक्का दे रहा है।

मैं कॉलम 1 के मैक्सविड्थ को सेट करके इसे रोकना चाहता हूं खिड़की चौड़ाई का एक तिहाई (या ऐसा कुछ)। मैं इसे आसानी से कोड में कर सकता हूं, लेकिन इसे "एक्सएएमएल केवल" में कैसे करना है?

संपादित करें: डेविड श्मिट ने बाध्यकारी के बजाय साझा आकार समूह का उपयोग करने का सुझाव दिया, जो एक उत्कृष्ट सुझाव है। मेरे नमूना कोड इस तो ऐसा दिखाई देगा:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
     <Grid IsSharedSizeScope="True"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition x:Name="Column1" SharedSizeGroup="ColWidth" Width="40"/> 
       <ColumnDefinition x:Name="Column2" MinWidth="50" Width="*" /> 
       <ColumnDefinition x:Name="Column3" SharedSizeGroup="ColWidth"/> 
      </Grid.ColumnDefinitions> 
      <Label Grid.Column="0" Background="Green" /> 
      <GridSplitter Grid.Column="0" Width="5" /> 
      <Label Grid.Column="1" Background="Yellow" /> 
      <Label Grid.Column="2" Background="Red" /> 
     </Grid> 
</Page> 

उत्तर

7

मुझे लगता है कि एक्सएएमएल-केवल दृष्टिकोण कुछ सर्किट है, लेकिन यहां ऐसा करने का एक तरीका है।

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 

    <!-- This contains our real grid, and a reference grid for binding the layout--> 
    <Grid x:Name="Container"> 

     <!-- hidden because it's behind the grid below --> 
     <Grid x:Name="LayoutReference"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <!-- We need the border, because the column doesn't have an ActualWidth --> 
     <Border x:Name="ReferenceBorder" 
       Background="Black" /> 
     <Border Background="White" Grid.Column="1" /> 
     <Border Background="Black" Grid.Column="2" /> 
     </Grid> 

     <!-- I made this transparent, so we can see the reference --> 
     <Grid Opacity="0.9"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition x:Name="Column1" 
           MaxWidth="{Binding ElementName=ReferenceBorder,Path=ActualWidth}"/> 
       <ColumnDefinition x:Name="Column2" 
           MinWidth="50" /> 
       <ColumnDefinition x:Name="Column3" 
           Width="{ Binding ElementName=Column1, Path=Width }"/> 
       </Grid.ColumnDefinitions> 

      <Label Grid.Column="0" Background="Green"/> 
      <GridSplitter Grid.Column="0" Width="5" /> 
      <Label Grid.Column="1" Background="Yellow" /> 
      <Label Grid.Column="2" Background="Red" /> 
     </Grid> 
    </Grid> 

</Page> 
+4

कृपया किसी अन्य कॉलम की चौड़ाई के लिए बाध्यकारी के बजाय साझा आकार समूह का उपयोग करें! –

+0

मैंने XamlPad में ऊपर xaml की कोशिश की और यह अजीब तरह से व्यवहार किया, लेकिन मैं तुम्हारा बिंदु देखता हूँ! धन्यवाद। –

0

बहुत आलसी वास्तव में यह अपने आप में लिखने के लिए ऊपर है, लेकिन आप (या तो नाम से, या के साथ एक गणितीय कनवर्टर का उपयोग करें और अपने माता-पिता खिड़कियों चौड़ाई के लिए बाध्य करने के लिए सक्षम होना चाहिए एक सापेक्ष स्रोत पूर्वजों की खोज)।

//I know I borrowed this from someone, sorry I forgot to add a comment from whom 
public class ScaledValueConverter : IValueConverter 
{ 
    public Object Convert(Object value, Type targetType, Object parameter, System.Globalization.CultureInfo culture) 
    { 
    Double scalingFactor = 0; 
    if (parameter != null) 
    { 
     Double.TryParse((String)(parameter), out scalingFactor); 
    } 

    if (scalingFactor == 0.0d) 
    { 
     return Double.NaN; 
    } 

    return (Double)value * scalingFactor; 
    } 

    public Object ConvertBack(Object value, Type targetType, Object parameter, System.Globalization.CultureInfo culture) 
    { 
    throw new Exception("The method or operation is not implemented."); 
    } 
} 
संबंधित मुद्दे