2012-05-13 11 views
6

Tengo una grilla. Tengo que definir cada columna y fila de forma manual, como esto:¿Cómo configuro una columna de cuadrícula/tamaño de fila sin definir cada línea?

<Window x:Class="GridBuild" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="GridBuild" Height="300" Width="300"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions>   
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions>   
</Grid> 

quiero definir el número de filas y columnas con una sola línea, algo como esto:

<Window x:Class="GridBuild" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="GridBuild" Height="300" Width="300"> 
    <Grid> 
     <Grid.NumberOfRows="2"/> 
     <Grid.NumberOfColumns/> 
    </Grid> 
</Window> 

Respuesta

4

Propongo derivar de Grid y agregar estas propiedades a la siguiente como:

public class GridEx : Grid 
{ 
    public int NumberOfRows 
    { 
     get { return RowDefinitions.Count; } 
     set 
     { 
      RowDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       RowDefinitions.Add(new RowDefinition()); 
     } 
    } 

    public int NumberOfColumns 
    { 
     get { return ColumnDefinitions.Count; } 
     set 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     } 
    } 
} 

Ahora se puede utilizar de la siguiente manera:

<local:GridEx NumberOfRows="3" NumberOfColumns="2"> 
    <TextBox>some text</TextBox> 
    <TextBox Grid.Row="1">some text</TextBox> 
    <TextBox Grid.Row="2">some text</TextBox> 

    <TextBox Grid.Column="1">some text</TextBox> 
    <TextBox Grid.Row="1" Grid.Column="1">some text</TextBox> 
    <TextBox Grid.Row="2" Grid.Column="1">some text</TextBox> 
</local:GridEx> 

Trabaja en diseño, así por cierto :)

El reto aquí es fijar diferente anchura, altura, etc., para diferentes filas y columnas. Tengo un buen pensamiento sobre cómo hacer esto. También es posible automatizar la asignación de Grid.Row y Grid.Column. Piénselo :)

7

Lo que usted describe se llama UniformGrid. Tiene Columns y Rows propiedades mediante las cuales puede establecer el número de filas o columnas que desea.

Si no establece estas propiedades, el UniformGrid intentará colocar a los niños lo más cerca posible de un cuadrado. En esta situación, prefiere aumentar el número de columnas antes de aumentar el número de filas.

Es un panel oscuro, pero es extremadamente potente cuando se usa correctamente.

1

Mire aquí por un ayudante que hace exactamente lo que pides: https://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/

si ha añadido al ayudante del enlace anterior para su proyecto, usted puede utilizarlo como eso:

<Grid local:GridHelpers.RowCount="6" 
     local:GridHelpers.StarRows="5" 
     local:GridHelpers.ColumnCount="4" 
     local:GridHelpers.StarColumns="1,3"> 
</Grid> 
+0

Cómo definido locales –

3

La respuesta anterior de EvAlex funcionará, pero solo si no desea establecer el número de columnas/filas mediante el enlace de datos.

public class GridEx : Grid 
{ 
    public int NumberOfRows 
    { 
     get { return RowDefinitions.Count; } 
     set 
     { 
      RowDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       RowDefinitions.Add(new RowDefinition()); 
     } 
    } 

    public int NumberOfColumns 
    { 
     get { return ColumnDefinitions.Count; } 
     set 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     } 
    } 
} 

Si desea establecer estos a través del enlace de datos (como yo), y luego con la solución anterior el compilador se quejará porque necesita DependencyProperties para eso. Un DependencyProperty pueden implementarse (usando C# de 6 nameof operador) de la siguiente manera (una forma rápida de insertar está utilizando el propdp fragmento):

public int Columns 
{ 
    get { return (int) GetValue(ColumnsDependencyProperty); } 
    set { SetValue(ColumnsDependencyProperty, value); } 
} 
public static readonly DependencyProperty ColumnsDependencyProperty = 
    DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0)); 

Pero de esta manera no se puede ejecutar la lógica necesaria para añadir la necesaria número de RowDefinitions. Para solucionar esto, defina DependencyPropertyDescriptor para cada DependencyProperty y agregue una llamada AddValueChanged con la lógica necesaria en el constructor de su clase personalizada. El resultado por Propery es entonces (usando C# de 6 operador null-condicional ?.):

public int Columns 
    { 
     get { return (int) GetValue(ColumnsDependencyProperty); } 
     set { SetValue(ColumnsDependencyProperty, value); } 
    } 
    public static readonly DependencyProperty ColumnsDependencyProperty = 
     DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0)); 

    DependencyPropertyDescriptor ColumnsPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ColumnsDependencyProperty, typeof(GridEx)); 

    public GridEx() 
    { 
     ColumnsPropertyDescriptor?.AddValueChanged(this, delegate 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < Columns; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     }); 
    } 
Cuestiones relacionadas