Como faço para colocar uma borda na minha grade no WPF?

119

Como faço para colocar uma borda na minha grade em C # / WPF?

Isso é o que eu gostaria que fosse, mas coloca uma borda ao redor de tudo em vez do controle de grade que coloquei em meu aplicativo.

<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
fonte
1
O que você quer dizer com "coisa toda"? Eu suspeito que você tenha algo mais dentro de sua grade - você talvez deva postar o que é. Minha suspeita é que você tem algum tipo de controle de grade de dados, bem como seu contêiner de grade (que é o que você colocou em sua amostra e presumivelmente conteria a "coisa toda") e é aí que surge a confusão.
Dan Puzey

Respostas:

213

Se você deseja apenas uma borda externa, a maneira mais fácil é colocá-la em um controle de borda:

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

A razão pela qual você está vendo a borda preencher completamente o seu controle é que, por padrão, HorizontalAlignment e VerticalAlignment estão definidos como Stretch. Experimente o seguinte:

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

Isso deve dar a você o que você procura (embora você possa querer colocar uma margem em todos os 4 lados, não apenas em 2 ...)

Reed Copsey
fonte
não funciona como desejo ... adicionei um código à minha pergunta.
Jason94
3
@ Jason94: Atualizei minha resposta para mostrar a você como conseguir o que acho que você procura ...
Reed Copsey
@ReedCopsey Reed, sei que sua solução funciona, o que não entendo é por que o elemento Border está dentro do elemento Grid - isso não é contra-intuitivo? Obrigado.
Sabuncu
2
@Sabuncu Você notará que meu original não tinha isso - eu estava fazendo a edição do OP "funcionar"
Reed Copsey
1
Isso parece colocar uma fronteira ao redor da parte interna da minha janela principal e não ao redor do lado externo da grade que está encapsulada dentro dela. Alguma ideia por quê?
Brady
9

Se aninhar sua grade em um controle de fronteira

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

não faz o que você deseja, então você terá que fazer seu próprio modelo de controle para a grade (ou borda) que FAZ o que você deseja.

Muad'Dib
fonte
oh ... ok: D pensei que havia uma variável que eu
esqueci
Você não pode criar um modelo para grade e borda porque eles não têm nenhuma propriedade de modelo, pois não são derivados de controle, mas de painel e decorador. Reed Copsey tem a solução (bastante simples) .
gehho
2

Acho que o seu problema é que a margem deve ser especificada na tag de borda e não na grade.

surega
fonte
2

Esta é uma resposta posterior que funciona para mim, se puder ser útil para alguém no futuro. Eu queria uma borda simples ao redor de todos os quatro lados da grade e consegui assim ...

<DataGrid x:Name="dgDisplay" Margin="5" BorderBrush="#1266a7" BorderThickness="1"...
georgehatzi
fonte
O Gridcontrole não tem um BorderBrushatributo, mas DataGridtem ...
Ω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 envolve uma borda dentro do "innerGrid"

PJ3
fonte
Olá, @ElvinMammadov. Você pode descrever mais. Você está recebendo algum erro? Este código funciona bem para mim.
PJ3
1
É necessário adicionar Grid.ColumnSpan = "as colunas que você deseja cobrir" Grid.RowSpan = "As linhas que deseja cobrir" na tag Border. Caso contrário, cobre apenas a primeira célula.
user3707094
0

Se alguém estiver interessado no problema semelhante, mas não estiver trabalhando com XAML, aqui está minha solução:

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);
TripleAccretion
fonte