Làm cách nào để đặt đường viền trên lưới của tôi trong WPF?


119

Làm cách nào để đặt đường viền trên lưới của tôi trong C # / WPF?

Đây là những gì tôi muốn, nhưng đặt một đường viền xung quanh toàn bộ thay vì điều khiển lưới mà tôi đã đặt trong ứng dụng của mình.

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

1
Bạn có nghĩa là gì bởi "toàn bộ điều"? Tôi nghi ngờ bạn có thứ gì đó khác bên trong lưới của bạn - có lẽ bạn nên đăng cái đó là gì. Tôi nghi ngờ là bạn có một số loại kiểm soát datagrid cũng như vùng chứa lưới của bạn (đó là những gì bạn đã đặt trong mẫu của mình và có lẽ sẽ chứa "toàn bộ") và đó là nơi nảy sinh sự nhầm lẫn.
Dan Puzey

Câu trả lời:


213

Nếu bạn chỉ muốn có một đường viền bên ngoài, cách dễ nhất là đặt nó trong một điều khiển Border:

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

Lý do bạn thấy đường viền hoàn toàn lấp đầy điều khiển của mình là theo mặc định, HorizontalAlignment và VerticalAlignment được đặt thành Stretch. Hãy thử những cách sau:

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

Điều này sẽ giúp bạn có được những gì bạn đang theo đuổi (mặc dù bạn có thể muốn đặt lợi nhuận trên cả 4 mặt, không chỉ 2 ...)


nó không hoạt động như tôi muốn ... tôi đã thêm một số mã vào câu hỏi của mình.
Jason94

3
@ Jason94: Tôi đã cập nhật câu trả lời của mình để chỉ cho bạn cách đạt được những gì tôi nghĩ là bạn đang theo đuổi ...
Reed Copsey

@ReedCopsey Reed, tôi biết giải pháp của bạn hoạt động, điều tôi không hiểu là tại sao phần tử Border lại nằm bên trong phần tử Grid - bộ đếm này không trực quan sao? Cảm ơn bạn.
Sabuncu

2
@Sabuncu Bạn sẽ nhận thấy rằng bản gốc của tôi không có điều đó - Tôi đang làm cho bản chỉnh sửa của OP "hoạt động"
Reed Copsey

1
Điều này dường như đặt một nội trú xung quanh bên trong cửa sổ chính của tôi chứ không phải xung quanh bên ngoài của lưới được bao bọc bên trong nó. Bất kỳ ý tưởng tại sao?
Brady

9

Nếu lồng lưới của bạn trong điều khiển đường viền

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

không làm những gì bạn muốn, thì bạn sẽ phải tạo mẫu điều khiển của riêng bạn cho lưới (hoặc đường viền) mà KHÔNG làm những gì bạn muốn.


oh ... okey: D nghĩ rằng có một biến tôi đã bỏ qua hoặc một cái gì đó WPF ưa thích (tôi mới biết nó: D)
Jason94

Bạn không thể tạo Mẫu cho Lưới và Đường viền vì chúng không có thuộc tính Mẫu vì chúng không bắt nguồn từ Điều khiển mà từ Bảng điều khiển và Trình trang trí. Reed Copsey có giải pháp (khá đơn giản) .
gehho

2

Tôi nghĩ vấn đề của bạn là lề phải được chỉ định trong thẻ viền chứ không phải trong lưới.


2

Đây là câu trả lời sau này phù hợp với tôi, nếu nó có thể được sử dụng cho bất kỳ ai trong tương lai. Tôi muốn có một đường viền đơn giản xung quanh tất cả bốn cạnh của lưới và tôi đã đạt được nó như vậy ...

<DataGrid x:Name="dgDisplay" Margin="5" BorderBrush="#1266a7" BorderThickness="1"...

Điều Gridkhiển không có BorderBrushthuộc tính, nhưng DataGridcó ...
Ω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>

Mã này Bao quanh một đường viền bên trong "innerGrid"


Xin chào @ElvinMammadov. Bạn có thể mô tả thêm. bạn đang nhận được bất kỳ lỗi nào? Mã này hoạt động tốt đối với tôi.
PJ3

1
Cần thêm Grid.ColumnSpan = "các cột bạn muốn che" Grid.RowSpan = "Các hàng bạn muốn che" trong thẻ Border. Nếu không, nó chỉ bao gồm ô đầu tiên.
user3707094

0

Nếu ai đó quan tâm đến vấn đề tương tự nhưng không hoạt động với XAML, đây là giải pháp của tôi:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.