2011-12-17 16 views
9

Actualmente estoy fijando el fondo de cada fila de la cuadrícula de forma individual:Asignación de frontera para cada fila de la cuadrícula

<Grid> 
    <Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions> 
    <Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions> 

    <Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="6" Height="24" BorderBrush="#FF252A30" CornerRadius="10" BorderThickness="1"> 
     <Border.Background> 
      <LinearGradientBrush EndPoint="1.036,0.367" StartPoint="-0.194,0.362"> 
       <GradientStop Color="#AAE098" Offset="0.1"/> 
       <GradientStop Color="#D5E9D4" Offset="0.9"/> 
      </LinearGradientBrush> 
     </Border.Background> 
    </Border> 

    <Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="6" Height="24" BorderBrush="#FF252A30" CornerRadius="10" BorderThickness="1"> 
     <Border.Background> 
      <LinearGradientBrush EndPoint="1.036,0.367" StartPoint="-0.194,0.362"> 
       <GradientStop Color="#AAE098" Offset="0.1"/> 
       <GradientStop Color="#D5E9D4" Offset="0.9"/> 
      </LinearGradientBrush> 
     </Border.Background> 
    </Border> 
</Grid> 

Seguramente debe haber alguna manera de establecer esta frontera de una vez por todas filas. ¿Cómo se hace eso?

Gracias!

Respuesta

2

Podrías sacar ese borde de un recurso reutilizable, pero sospecho que lo que realmente intentas hacer es crear un GridView.

+0

creo que son, sin duda. ¿Cuál es el "recurso reutilizable" al que puedo poner el borde? – dotancohen

2

Puede simplemente establecer la propiedad Background en su Grid. Si hay coincidencia entre la frontera que está solicitando a las diferentes filas, puede crear un estilo por defecto (y si se desea, limitar el alcance de este estilo a la Grid sí mismo):

XAML

<Grid> 
    <Grid.Resources> 
     <Style TargetType="{x:Type Border}"> 
      <!-- All rows --> 
      <Setter Property="BorderBrush" Value="Black" /> 
      <Setter Property="BorderThickness" Value="2" /> 
      <Setter Property="CornerRadius" Value="5" /> 
     </Style> 
    </Grid.Resources> 

    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 

    <Border Grid.Row="0"> 
     <TextBlock Text="This row has a black border (default)." /> 
    </Border> 

    <Border BorderBrush="Red" Grid.Row="1"> 
     <TextBlock Text="This row has a red border." /> 
    </Border> 

    <Border BorderBrush="Green" BorderThickness="4" Grid.Row="2"> 
     <TextBlock Text="This has a thick green border." /> 
    </Border> 

</Grid> 

Con un valor predeterminado Style, no es necesario establecer ninguna propiedad adicional en el fila Border para obtener un aspecto predeterminado (fila uno arriba). Si una determinada fila necesita ajustar la apariencia, simplemente proporcione propiedades adicionales en el Border para anular las establecidas en el valor predeterminado Style (filas dos y tres anteriores). Si esta técnica es algo que está aplicando a través de múltiples vistas en su aplicación, entonces puede extraer este estilo en un ResourceDictionary separado y simplemente combinarlo donde corresponda.

Espero que esto ayude!

+0

¡Hola, F Ruffell! El fondo no es sólido en toda la cuadrícula, sino que cada fila tiene sus propias esquinas redondeadas al principio de la primera celda y al final de la última celda. Además, el ejemplo que menciona todavía requiere que el desarrollador actualice el elemento Borde para cada fila individualmente si cambia el requisito de BorderThickness. – dotancohen

+0

Al mover las propiedades establecidas comúnmente a un estilo predeterminado que tiene un ámbito para la Grilla, el elemento Borde no tiene propiedades para establecer (aparte del color, por ejemplo), y este enfoque no se repite (por ejemplo, BorderThickness se especifica solo una vez) y por lo tanto necesita ser actualizado solo una vez). Vea la respuesta editada arriba :) –

+0

@F Ruffell: Gracias, pero los estilos todavía afectan solo las celdas individuales, no las filas enteras. Para demostrar, si agrega atributos Grid.Column a los elementos del borde, se puede ver que cada celda tiene bordes redondeados, no cada fila. Mi objetivo es que cada fila tenga un color sólido, pero con bordes redondeados en las esquinas de la fila. El código en el OP hace esto, pero necesita ser definido (y actualizado) para cada fila individualmente. Me gustaría resumirlo en un estilo que se reutilice para cada fila. – dotancohen

15

O podría usar esta grilla que acabo de hacer. Automáticamente agregará un borde a cada celda en la grilla. Este es el resultado:

enter image description here

C#:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace GridWithBorder 
{ 
    public class BorderGrid : Grid 
    { 
     protected override void OnRender(DrawingContext dc) 
     { 
      double leftOffset = 0; 
      double topOffset = 0; 
      Pen pen = new Pen(Brushes.Black, 3); 
      pen.Freeze(); 

      foreach (RowDefinition row in this.RowDefinitions) 
      { 
       dc.DrawLine(pen, new Point(0, topOffset), new Point(this.ActualWidth, topOffset)); 
       topOffset += row.ActualHeight; 
      } 
      // draw last line at the bottom 
     dc.DrawLine(pen, new Point(0, topOffset), new Point(this.ActualWidth, topOffset)); 

      //foreach (ColumnDefinition column in this.ColumnDefinitions) 
      //{ 
      // dc.DrawLine(pen, new Point(leftOffset, 0), new Point(leftOffset, this.ActualHeight)); 
      // leftOffset += column.ActualWidth; 
      //} 
      // draw last line on the right 
      //dc.DrawLine(pen, new Point(leftOffset, 0), new Point(leftOffset, this.ActualHeight)); 

      base.OnRender(dc); 
     } 
    } 
} 

XAML:

<Window x:Class="GridWithBorder.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:GridWithBorder" 
     Title="MainWindow" Height="350" Width="525"> 
    <local:BorderGrid> 
     <local:BorderGrid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </local:BorderGrid.RowDefinitions> 
     <local:BorderGrid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </local:BorderGrid.ColumnDefinitions> 
     <Rectangle Grid.Row="0" Grid.Column="0" Fill="Red" Margin="5" /> 
     <Rectangle Grid.Row="0" Grid.Column="1" Fill="Blue" Margin="5" /> 
     <Rectangle Grid.Row="0" Grid.Column="2" Fill="Orange" Margin="5" /> 
     <Rectangle Grid.Row="0" Grid.Column="3" Fill="Red" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="0" Fill="Yellow" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="1" Fill="Green" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="2" Fill="Purple" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="3" Fill="Green" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="0" Fill="Orange" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="1" Fill="Red" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="2" Fill="Blue" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="3" Fill="Red" Margin="5" /> 
    </local:BorderGrid> 
</Window> 
+0

Gracias, esto es inteligente. Me está costando modificarlo para poner bordes alrededor de cada _row_, no cada celda.Una buena idea, sin embargo, hasta este punto estaba tratando de hacerlo solo en XAML. – dotancohen

+0

@dotancohen ah vale, entonces solo comenta la parte que acabo de comentar en el código C#, obtendrás este resultado http://screencast.com/t/NwdxtGQNyq. Lmk si necesita las primeras y últimas líneas verticales (para tener el borde alrededor de toda la cuadrícula) también puedo hacerlo. – Carlo

+0

@dotancohen ejemplo de borde alrededor de la cuadrícula y las filas, pero no las columnas aquí: http://screencast.com/t/d8GNqXRKGPf – Carlo

Cuestiones relacionadas