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 ...
Jason94
źródło
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 ...)

Reed Copsey
źródło
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.

Muad'Dib
źródło
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.

surega
źródło
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"...
georgehatzi
źródło
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”

PJ3
źródło
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);
TripleAccretion
źródło