2008-09-17 35 views
7

我在第一列有GridSplitter的窗口中有3列网格。我想将第一列的MaxWidth设置为父窗口或页面的三分之一,如果可能,我宁愿在XAML中执行此操作。如何在XAML中根据窗口或屏幕大小设置网格列MaxWidth

这是XAMLPad(或类似的)中的一些示例XAML,它显示了我在做什么。

<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列的MaxWidth设置为三分之一的窗口宽度(或类似的东西)。我可以很容易地在代码中执行此操作,但是如何在“仅限XAML”中执行此操作?

编辑:大卫施密特建议使用SharedSizeGroup而不是绑定,这是一个很好的建议。我的示例代码应该是这样的,那么:

<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

我认为仅XAML方法有点迂回,但是这里有一个方法可以做到。

<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

请使用SharedSizeGroup而不是绑定到另一列的宽度! – 2008-10-03 22:48:50

0

懒得实际上它写了自己,但你应该能够用一个数学转换并绑定到你的父窗口宽度(按名称,或用一个RelativeSource祖先搜索)。

//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."); 
    } 
} 
相关问题