Wie setze ich in WPF einen Rahmen in mein Raster?

119

Wie setze ich in C # / WPF einen Rahmen in mein Raster?

Dies ist, was ich möchte, aber setzt eine Grenze um das Ganze anstelle der Rastersteuerung, die ich in meine Anwendung eingefügt habe.

<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
quelle
1
Was meinst du mit "ganzer Sache"? Ich vermute, Sie haben noch etwas in Ihrem Raster - Sie sollten vielleicht posten, was das ist. Mein Verdacht ist, dass Sie eine Art Datagrid-Steuerung sowie Ihren Grid-Container haben (was Sie in Ihre Stichprobe aufgenommen haben und vermutlich das "Ganze" enthalten würden), und hier entsteht die Verwirrung.
Dan Puzey

Antworten:

213

Wenn Sie nur einen äußeren Rand möchten, können Sie ihn am einfachsten in ein Rand-Steuerelement einfügen:

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

Der Grund dafür, dass der Rahmen Ihr Steuerelement vollständig ausfüllt, ist, dass die horizontale Ausrichtung und die vertikale Ausrichtung standardmäßig auf Strecken eingestellt sind. Versuche Folgendes:

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

Dies sollte Ihnen das bringen, wonach Sie suchen (obwohl Sie vielleicht einen Rand auf alle 4 Seiten setzen möchten, nicht nur auf 2 ...)

Reed Copsey
quelle
es funktioniert nicht wie ich will ... ich habe meiner Frage einen Code hinzugefügt.
Jason94
3
@ Jason94: Ich habe meine Antwort aktualisiert, um Ihnen zu zeigen, wie Sie das bekommen, wonach Sie suchen ...
Reed Copsey
@ReedCopsey Reed, ich weiß, dass Ihre Lösung funktioniert. Ich verstehe nicht, warum sich das Border-Element im Grid-Element befindet. Ist das nicht kontraintuitiv? Danke dir.
Sabuncu
2
@ Sabuncu Sie werden feststellen, dass mein Original das nicht hatte - ich habe die Bearbeitung des OP "funktionieren" lassen
Reed Copsey
1
Dies scheint eine Grenze um die Innenseite meines Hauptfensters und nicht um die Außenseite des darin eingekapselten Gitters zu platzieren. Irgendwelche Ideen warum?
Brady
9

Wenn Sie Ihr Raster in einem Rahmensteuerelement verschachteln

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

Wenn Sie nicht das tun, was Sie möchten, müssen Sie Ihre eigene Steuerungsvorlage für das Raster (oder den Rand) erstellen, das das tut, was Sie möchten.

Muad'Dib
quelle
oh ... okey: D dachte, es gäbe eine Variable, die ich übersehen habe, oder etwas Besonderes WPF (
ich bin
Sie können keine Vorlage für Raster und Rahmen erstellen, da diese keine Vorlageneigenschaft haben, da sie nicht von Control, sondern von Panel und Decorator abgeleitet sind. Reed Copsey hat die (ziemlich einfache) Lösung .
gehho
2

Ich denke, Ihr Problem ist, dass der Rand im Rahmen-Tag und nicht im Raster angegeben werden sollte.

surega
quelle
2

Dies ist eine spätere Antwort, die für mich funktioniert, wenn sie in Zukunft für irgendjemanden von Nutzen sein kann. Ich wollte einen einfachen Rand um alle vier Seiten des Gitters und habe es so erreicht ...

<DataGrid x:Name="dgDisplay" Margin="5" BorderBrush="#1266a7" BorderThickness="1"...
Georgehatzi
quelle
Das GridSteuerelement hat kein BorderBrushAttribut, aber DataGrid...
Ω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>

Dieser Code Umschließt einen Rand innerhalb des "innerGrid"

PJ3
quelle
Hallo @ElvinMammadov. Kannst du mehr beschreiben? Erhalten Sie Fehler? Dieser Code funktioniert gut für mich.
PJ3
1
Sie müssen Grid.ColumnSpan = "die Spalten, die Sie abdecken möchten" hinzufügen. Grid.RowSpan = "Die Zeilen, die Sie abdecken möchten" im Rahmen-Tag. Andernfalls wird nur die erste Zelle abgedeckt.
user3707094
0

Wenn jemand an einem ähnlichen Problem interessiert ist, aber nicht mit XAML arbeitet, ist hier meine Lösung:

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
quelle