Comment mettre une bordure sur ma grille dans WPF?

119

Comment mettre une bordure sur ma grille en C # / WPF?

C'est ce que je voudrais que ce soit, mais met une bordure autour de l'ensemble au lieu du contrôle de grille que j'ai mis dans mon application.

<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
la source
1
Qu'entendez-vous par «tout»? Je soupçonne que vous avez autre chose à l'intérieur de votre grille - vous devriez peut-être publier ce que c'est. Je soupçonne que vous avez une sorte de contrôle de grille de données ainsi que votre conteneur de grille (qui est ce que vous avez mis dans votre échantillon et contiendrait vraisemblablement le «tout») et c'est là que la confusion surgit.
Dan Puzey

Réponses:

213

Si vous voulez juste une bordure extérieure, le moyen le plus simple est de la placer dans un contrôle Border:

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

La raison pour laquelle vous voyez la bordure remplir complètement votre contrôle est que, par défaut, c'est HorizontalAlignment et VerticalAlignment sont définis sur Stretch. Essayez ce qui suit:

<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>

Cela devrait vous permettre d'obtenir ce que vous recherchez (bien que vous souhaitiez peut-être mettre une marge sur les 4 côtés, pas seulement sur 2 ...)

Reed Copsey
la source
cela ne fonctionne pas comme je le souhaite ... j'ai ajouté du code à ma question.
Jason94
3
@ Jason94: J'ai mis à jour ma réponse pour vous montrer comment obtenir ce que je pense que vous recherchez ...
Reed Copsey
@ReedCopsey Reed, je sais que votre solution fonctionne, ce que je ne comprends pas, c'est pourquoi l'élément Border est à l'intérieur de l'élément Grid - n'est-ce pas contre-intuitif? Je vous remercie.
Sabuncu
2
@Sabuncu Vous remarquerez que mon original n'avait pas ça - je faisais le montage de l'OP "fonctionne"
Reed Copsey
1
Cela semble placer une frontière autour de l'intérieur de ma fenêtre principale et non autour de l'extérieur de la grille qui y est encapsulée. Des idées pourquoi?
Brady
9

Si vous imbriquez votre grille dans un contrôle de bordure

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

ne fait pas ce que vous voulez, alors vous allez devoir créer votre propre modèle de contrôle pour la grille (ou la bordure) qui FAIT ce que vous voulez.

Muad'Dib
la source
oh ... okey: D pensait qu'il y avait une variable que j'avais négligée ou quelque chose d'extraordinaire WPF (je suis nouveau: D)
Jason94
Vous ne pouvez pas créer un modèle pour la grille et la bordure car ils n'ont pas de propriété de modèle car ils ne sont pas dérivés de Control, mais de Panel et Decorator. Reed Copsey a la solution (assez simple) .
gehho
2

Je pense que votre problème est que la marge doit être spécifiée dans l'étiquette de bordure et non dans la grille.

surega
la source
2

C'est une réponse ultérieure qui fonctionne pour moi, si elle peut être utile à n'importe qui dans le futur. Je voulais une simple bordure autour des quatre côtés de la grille et je l'ai réalisé comme ça ...

<DataGrid x:Name="dgDisplay" Margin="5" BorderBrush="#1266a7" BorderThickness="1"...
Georgehatzi
la source
Le Gridcontrôle n'a pas d' BorderBrushattribut, mais a DataGrid...
Ω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>

Ce code enveloppe une bordure à l'intérieur du "innerGrid"

PJ3
la source
Salut @ElvinMammadov. Pouvez-vous en décrire davantage. Avez-vous des erreurs? Ce code fonctionne très bien pour moi.
PJ3 du
1
Besoin d'ajouter Grid.ColumnSpan = "les colonnes que vous souhaitez couvrir" Grid.RowSpan = "Les lignes que vous souhaitez couvrir" dans la balise Border. Sinon, il ne couvre que la première cellule.
user3707094
0

Si quelqu'un est intéressé par le problème similaire, mais ne travaille pas avec XAML, voici ma solution:

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);
TripleAccrétion
la source