Bagaimana cara memberi batas pada kisi saya di WPF?

119

Bagaimana cara memberi batas pada kisi saya di C # / WPF?

Ini adalah apa yang saya inginkan, tetapi menempatkan batas di sekitar semuanya alih-alih kontrol kisi yang saya masukkan ke dalam aplikasi saya.

<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
sumber
1
Apa yang Anda maksud dengan "semuanya"? Saya curiga Anda memiliki sesuatu yang lain di dalam jaringan Anda - Anda mungkin harus memposting apa itu. Kecurigaan saya adalah bahwa Anda memiliki semacam kontrol datagrid serta wadah grid Anda (yang telah Anda masukkan ke dalam sampel Anda dan mungkin berisi "semuanya") dan di situlah kebingungan muncul.
Dan Puzey

Jawaban:

213

Jika Anda hanya ingin batas luar, cara termudah adalah dengan meletakkannya di kontrol Perbatasan:

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

Alasan Anda melihat border memenuhi kontrol Anda adalah karena, secara default, HorizontalAlignment dan VerticalAlignment disetel ke Stretch. Coba yang berikut ini:

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

Ini akan memberi Anda apa yang Anda cari (meskipun Anda mungkin ingin memberi margin pada keempat sisi, bukan hanya 2 ...)

Reed Copsey
sumber
itu tidak berfungsi seperti yang saya inginkan ... saya telah menambahkan beberapa kode ke pertanyaan saya.
Jason94
3
@ Jason94: Saya memperbarui jawaban saya untuk menunjukkan kepada Anda bagaimana mendapatkan apa yang menurut saya Anda cari ...
Reed Copsey
@ReedCopsey Reed, saya tahu solusi Anda berfungsi, yang tidak saya mengerti adalah mengapa elemen Border ada di dalam elemen Grid - bukankah counter ini intuitif? Terima kasih.
Sabuncu
2
@Sabuncu Anda akan melihat bahwa dokumen asli saya tidak memiliki itu - Saya membuat "pekerjaan" pengeditan OP
Reed Copsey
1
Ini sepertinya menempatkan boarder di sekitar bagian dalam jendela utama saya dan bukan di luar grid yang terbungkus di dalamnya. Ada ide kenapa?
Brady
9

Jika menumpuk grid Anda di kontrol perbatasan

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

tidak melakukan apa yang Anda inginkan, maka Anda harus membuat template kontrol Anda sendiri untuk kisi (atau batas) yang TIDAK melakukan apa yang Anda inginkan.

Muad'Dib
sumber
oh ... okey: D mengira ada variabel yang saya abaikan atau sesuatu yang mewah WPF (saya baru dalam hal itu: D)
Jason94
Anda tidak dapat membuat Template untuk Grid dan Border karena mereka tidak memiliki properti Template karena bukan berasal dari Control, tetapi dari Panel dan Decorator. Reed Copsey memiliki solusi (yang cukup sederhana) .
gehho
2

Saya pikir masalah Anda adalah bahwa margin harus ditentukan di tag perbatasan dan bukan di kisi.

surega
sumber
2

Ini adalah jawaban selanjutnya yang berhasil untuk saya, jika mungkin berguna bagi siapa pun di masa depan. Saya ingin perbatasan sederhana di sekitar keempat sisi kisi dan saya mencapainya seperti itu ...

<DataGrid x:Name="dgDisplay" Margin="5" BorderBrush="#1266a7" BorderThickness="1"...
georgehatzi
sumber
The Gridkontrol tidak memiliki BorderBrushatribut, tetapi DataGridtidak ...
Ω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>

Kode ini Bungkus perbatasan di dalam "innerGrid"

PJ3
sumber
Hai @Elvin. Bisakah Anda menjelaskan lebih banyak. Apakah Anda mendapatkan kesalahan? Kode ini berfungsi dengan baik untuk saya.
PJ3
1
Perlu menambahkan Grid.ColumnSpan = "kolom yang ingin Anda tutupi" Grid.RowSpan = "Baris yang ingin Anda tutupi" di tag Border. Jika tidak, itu hanya mencakup sel pertama.
user3707094
0

Jika seseorang tertarik dengan masalah serupa, tetapi tidak bekerja dengan XAML, inilah solusi saya:

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
sumber