Как поставить рамку на сетку в WPF?

119

Как поставить рамку на сетку в C # / WPF?

Это то, что я хотел бы, но ставит рамку вокруг всего этого вместо элемента управления сеткой, который я помещаю в свое приложение.

<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
источник
1
Что вы имеете в виду под «целым»? Я подозреваю, что у вас есть что-то еще внутри вашей сетки - возможно, вам стоит опубликовать, что это такое. Я подозреваю, что у вас есть какой-то элемент управления сеткой данных, а также контейнер сетки (который вы поместили в свой образец и который, вероятно, будет содержать «все это»), и вот где возникает путаница.
Дэн Пьюзи

Ответы:

213

Если вам просто нужна внешняя граница, самый простой способ - поместить ее в элемент управления Border:

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

Причина, по которой вы видите, что граница полностью заполняет ваш элемент управления, заключается в том, что по умолчанию для HorizontalAlignment и VerticalAlignment установлено значение Stretch. Попробуйте следующее:

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

Это должно дать вам то, что вам нужно (хотя вы можете добавить поля со всех 4 сторон, а не только с 2 ...)

Рид Копси
источник
он работает не так, как я хочу ... Я добавил код к своему вопросу.
Jason94
3
@ Jason94: Я обновил свой ответ, чтобы показать вам, как получить то, что, как я думаю, вам нужно ...
Рид Копси,
@ReedCopsey Reed, я знаю, что ваше решение работает, но я не понимаю, почему элемент Border находится внутри элемента Grid - разве этот счетчик не интуитивно понятен? Спасибо.
Sabuncu
2
@Sabuncu. Вы заметите, что в моем оригинале этого не было - я заставлял редактирование OP «работать»
Рид Копси,
1
Кажется, это помещает границу внутри моего главного окна, а не вокруг внешней части сетки, которая заключена в него. Есть идеи, почему?
Brady
9

Если ваша сетка вложена в пограничный элемент

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

не делает то, что вы хотите, тогда вам придется создать свой собственный шаблон управления для сетки (или границы), который ДЕЙСТВИТЕЛЬНО делает то, что вы хотите.

Муад'Диб
источник
о ... хорошо: D думал, что есть переменная, которую я упустил, или что-то необычное WPF (я новичок в этом: D)
Jason94
Вы не можете создать шаблон для сетки и границы, потому что у них нет свойства шаблона, поскольку они являются производными не от Control, а от Panel и Decorator. У Рида Копси есть (довольно простое) решение .
gehho
2

Думаю, ваша проблема в том, что поля нужно указывать в теге границы, а не в сетке.

surega
источник
2

Это более поздний ответ, который работает для меня, если он может быть кому-то полезен в будущем. Я хотел простую границу вокруг всех четырех сторон сетки, и я добился этого так ...

<DataGrid x:Name="dgDisplay" Margin="5" BorderBrush="#1266a7" BorderThickness="1"...
georgehatzi
источник
У GridBorderBrushDataGrid
элемента
1
<Grid x:Name="outerGrid">
    <Grid x:Name="innerGrid">
        <Border BorderBrush="#FF179AC8" BorderThickness="2" />
        <other stuff></other stuff>
        <other stuff></other stuff>
    </Grid>
</Grid>

Этот код Оборачивает границу внутри "innerGrid"

PJ3
источник
Привет, @ElvinMammadov. Можете описать подробнее. Вы получаете ошибки? Этот код мне подходит.
PJ3 04
1
Необходимо добавить Grid.ColumnSpan = "столбцы, которые вы хотите покрыть" Grid.RowSpan = "Строки, которые вы хотите покрыть" в теге Border. В противном случае он покрывает только первую ячейку.
user3707094
0

Если кого-то интересует аналогичная проблема, но он не работает с XAML, вот мое решение:

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
источник