¿Cómo pongo un borde en mi cuadrícula en WPF?

119

¿Cómo coloco un borde en mi cuadrícula en C # / WPF?

Esto es lo que me gustaría que fuera, pero pone un borde alrededor de todo en lugar del control de cuadrícula que puse en mi aplicación.

<Grid>
    <Border BorderBrush="Black" BorderThickness="2">
        <Grid Height="166" HorizontalAlignment="Left" Margin="12,12,0,0" Name="grid1" VerticalAlignment="Top" Width="479" Background="#FFF2F2F2" />
    </Border>
... and so on ...
Jason94
fuente
1
¿Qué quieres decir con "todo"? Sospecho que tiene algo más dentro de su cuadrícula; tal vez debería publicar lo que es. Mi sospecha es que tiene algún tipo de control de cuadrícula de datos, así como su contenedor de cuadrícula (que es lo que ha puesto en su muestra y presumiblemente contendría "todo") y ahí es donde surge la confusión.
Dan Puzey

Respuestas:

213

Si solo desea un borde exterior, la forma más fácil es ponerlo en un control de borde:

<Border BorderBrush="Black" BorderThickness="2">
    <Grid>
       <!-- Grid contents here -->
    </Grid>
</Border>

La razón por la que ve que el borde ocupa completamente su control es que, de forma predeterminada, HorizontalAlignment y VerticalAlignment están configurados en Estirar. Intente lo siguiente:

<Grid>
    <Border  HorizontalAlignment="Left" VerticalAlignment="Top"  BorderBrush="Black" BorderThickness="2">
        <Grid Height="166" HorizontalAlignment="Left" Margin="12,12,0,0" Name="grid1" VerticalAlignment="Top" Width="479" Background="#FFF2F2F2" />
    </Border>
</Grid>

Esto debería darte lo que buscas (aunque es posible que desees dejar un margen en los 4 lados, no solo en 2 ...)

Reed Copsey
fuente
no funciona como quiero ... he agregado un código a mi pregunta.
Jason94
3
@ Jason94: Actualicé mi respuesta para mostrarte cómo obtener lo que creo que buscas ...
Reed Copsey
@ReedCopsey Reed, sé que su solución funciona, lo que no entiendo es por qué el elemento Borde está dentro del elemento Cuadrícula, ¿no es esto contrario a la intuición? Gracias.
Sabuncu
2
@Sabuncu Notarás que mi original no tenía eso - estaba haciendo que la edición del OP "funcionara"
Reed Copsey
1
Esto parece colocar un borde alrededor del interior de mi ventana principal y no alrededor del exterior de la cuadrícula que está encapsulada dentro de ella. ¿Alguna idea de por qué?
Brady
9

Si anida su cuadrícula en un control fronterizo

<Border>
    <Grid>
    </Grid>
</Border>

no hace lo que quiere, entonces tendrá que crear su propia plantilla de control para la cuadrícula (o borde) que SÍ hace lo que quiere.

Muad'Dib
fuente
oh ... okey: D pensé que había una variable que pasé por alto o algo elegante WPF (soy nuevo en eso: D)
Jason94
No puede crear una Plantilla para Cuadrícula y Borde porque no tienen propiedad de Plantilla ya que no se derivan de Control, sino de Panel y Decorador. Reed Copsey tiene la solución (bastante simple) .
gehho
2

Creo que su problema es que el margen debe especificarse en la etiqueta del borde y no en la cuadrícula.

surega
fuente
2

Esta es una respuesta posterior que me funciona, si puede ser de utilidad para alguien en el futuro. Quería un borde simple alrededor de los cuatro lados de la cuadrícula y lo logré así ...

<DataGrid x:Name="dgDisplay" Margin="5" BorderBrush="#1266a7" BorderThickness="1"...
Georgehatzi
fuente
El Gridcontrol no tiene un BorderBrushatributo, pero DataGridsí ...
ΩmegaMan
1
<Grid x:Name="outerGrid">
    <Grid x:Name="innerGrid">
        <Border BorderBrush="#FF179AC8" BorderThickness="2" />
        <other stuff></other stuff>
        <other stuff></other stuff>
    </Grid>
</Grid>

Este código envuelve un borde dentro de "innerGrid"

PJ3
fuente
Hola @ElvinMammadov. ¿Puede describir más? ¿Tiene algún error? Este código me funciona bien.
PJ3
1
Necesita agregar Grid.ColumnSpan = "las columnas que desea cubrir" Grid.RowSpan = "Las filas que desea cubrir" en la etiqueta de borde. De lo contrario, solo cubre la primera celda.
user3707094
0

Si alguien está interesado en un problema similar, pero no funciona con XAML, esta es mi solución:

var B1 = new Border();
B1.BorderBrush = Brushes.Black;
B1.BorderThickness = new Thickness(0, 1, 0, 0); //You can specify here which borders do you want
YourPanel.Children.Add(B1);
Triple Accreción
fuente