Jak umieścić obramowanie na mojej siatce w WPF?


119

Jak umieścić obramowanie na mojej siatce w C # / WPF?

Tak właśnie chciałbym, ale umieszcza obramowanie wokół całej rzeczy zamiast kontroli siatki, którą umieściłem w mojej aplikacji.

<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
Co masz na myśli mówiąc „całość”? Podejrzewam, że masz coś innego w swojej sieci - może powinieneś opublikować, co to jest. Podejrzewam, że masz jakiś rodzaj kontroli datagrid, a także swój pojemnik w siatce (który jest tym, co umieściłeś w swojej próbce i prawdopodobnie zawierałby „całość”) i właśnie tam powstaje zamieszanie.
Dan Puzey

Odpowiedzi:


213

Jeśli potrzebujesz tylko zewnętrznej granicy, najłatwiej jest umieścić ją w kontroli granicznej:

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

Powodem, dla którego widzisz obramowanie całkowicie wypełniające twoją kontrolkę, jest to, że domyślnie jest to ustawienie HorizontalAlignment i VerticalAlignment na Stretch. Spróbuj wykonać następujące czynności:

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

To powinno dać ci to, czego szukasz (chociaż możesz chcieć umieścić margines ze wszystkich 4 stron, a nie tylko 2 ...)


nie działa tak, jak chcę ... dodałem kod do mojego pytania.
Jason94

3
@ Jason94: Zaktualizowałem moją odpowiedź, aby pokazać, jak zdobyć to, o czym myślę, że szukasz ...
Reed Copsey

@ReedCopsey Reed, wiem, że twoje rozwiązanie działa, nie rozumiem, dlaczego element Border znajduje się wewnątrz elementu Grid - czy to nie jest intuicyjne? Dziękuję Ci.
Sabuncu

2
@Sabuncu Zauważysz, że mój oryginał tego nie miał - robiłem "pracę" do edycji OP
Reed Copsey

1
Wydaje się, że obramowanie jest umieszczane wokół wnętrza mojego głównego okna, a nie wokół zewnętrznej strony siatki, która jest w nim zamknięta. Jakieś pomysły, dlaczego?
Brady

9

Jeśli zagnieżdżasz siatkę w kontroli granicznej

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

nie robi tego, co chcesz, będziesz musiał stworzyć własny szablon kontrolny dla siatki (lub obramowania), która ROBI to, co chcesz.


oh ... okey: D Myślałem, że jest zmienna, którą przeoczyłem lub coś wyszukanego WPF (
jestem

Nie możesz utworzyć szablonu dla siatki i obramowania, ponieważ nie mają one właściwości szablonu, ponieważ nie pochodzą one z elementu Control, ale z panelu i dekoratora. Reed Copsey ma (całkiem proste) rozwiązanie .
gehho

2

Myślę, że twój problem polega na tym, że margines powinien być określony w znaczniku obramowania, a nie w siatce.


2

To jest późniejsza odpowiedź, która mi pasuje, jeśli może się przydać komukolwiek w przyszłości. Chciałem mieć prostą ramkę wokół wszystkich czterech stron siatki i tak to osiągnąłem ...

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

GridKontrola nie posiada BorderBrushatrybut, ale DataGridnie ...
Ω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>

Ten kod Zawiń obramowanie wewnątrz elementu „innerGrid”


Cześć @ElvinMammadov. Czy możesz opisać więcej. Czy otrzymujesz jakieś błędy? Dla mnie ten kod działa dobrze.
PJ3,

1
Musisz dodać Grid.ColumnSpan = "kolumny, które chcesz zakryć" Grid.RowSpan = "Wiersze, które chcesz zakryć" w znaczniku Border. W przeciwnym razie obejmuje tylko pierwszą komórkę.
user3707094

0

Jeśli kogoś interesuje podobny problem, ale nie pracuje z XAML, oto moje rozwiązanie:

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.