172 Stimmen

WPF: Grid mit Spalte/Zeilenabstand/Rand?

Ist es einfach möglich, in einem WPF-Raster einen Rand und/oder Abstand für Zeilen oder Spalten anzugeben?

Ich könnte natürlich zusätzliche Spalten hinzufügen, um Dinge zu trennen, aber das scheint eine Aufgabe für Padding/Margins zu sein (es wird das XAML viel einfacher machen). Hat jemand vom Standard-Raster abgeleitet, um diese Funktionalität hinzuzufügen?

4 Stimmen

Ein nützliches Beispiel findest du hier: codeproject.com/Articles/107468/WPF-Padded-Grid

7 Stimmen

Ziemlich verwirrt, dass dies nicht Teil der Grundfunktionen des Grids ist...

2 Stimmen

Bis heute, wie von 10 Jahren Antworten gezeigt, ist die Wahrheit, dass es nicht einfach möglich ist, und das Beste, was getan werden kann (um zusätzliche fehleranfällige Arbeit jedes Mal zu vermeiden, wenn eine Zelle verwendet wird), ist es, Grid abzuleiten (wie bereits von @peter70 vorgeschlagen), um die entsprechende Zell-Padding-Abhängigkeitseigenschaft hinzuzufügen, die die Margin-Eigenschaft des Zellen-Kindes steuert. Dies ist keine lange Aufgabe, und dann haben Sie eine wiederverwendbare Steuerung. Nebenbemerkung... Grid ist wirklich eine schlecht gestaltete Steuerung.

4voto

Juan Pablo Punkte 678

Bearbeitet:

Um einem Steuerelement einen Rand zu geben, können Sie das Steuerelement mit einem Rahmen wie folgt umgeben

1 Stimmen

Das OP-Problem besteht nicht darin, einen Rand um das Raster zu haben, sondern einen Rand um Rasterzellen (oder wie tatsächlich um Zeilen und Spalten herum, später durch den Kommentar " genau das Hinzufügen von zusätzlichen Spalten/Zeilen ist, was ich vermeiden wollte" widersprochen).

3voto

Miloš Auder Punkte 29

Ich hatte vor Kurzem ein ähnliches Problem in einem Raster mit zwei Spalten, ich brauchte einen Rand nur auf Elementen in der rechten Spalte. Alle Elemente in beiden Spalten waren vom Typ TextBlock.

        <Style.Triggers>
            <Trigger Property="Grid.Column" Value="1">
                <Setter Property="Margin" Value="20,0" />
            </Trigger>
        </Style.Triggers>

2voto

isierra Punkte 47

Ich habe es gerade jetzt mit einem meiner Rastersysteme gemacht.

  • Zuerst wenden Sie den gleichen Rand auf jedes Element innerhalb des Rasters an. Dies können Sie manuell, mit Styles oder wie auch immer Sie möchten. Angenommen, Sie möchten einen horizontalen Abstand von 6px und einen vertikalen Abstand von 2px. Dann fügen Sie jedem Kind des Rasters Margen von "3px 1px" hinzu.
  • Dann entfernen Sie die um das Raster herum erstellten Ränder (wenn Sie die Grenzen der Steuerelemente innerhalb des Rasters auf die gleiche Position des Rasters ausrichten möchten). Setzen Sie dazu einen Rand von "-3px -1px" auf das Raster. Auf diese Weise werden andere Steuerelemente außerhalb des Rasters mit den äußersten Steuerelementen innerhalb des Rasters ausgerichtet.

0 Stimmen

Wenden Sie dieselbe Marge auf jedes Element innerhalb des Rasters an, scheint der einfachste Weg zu sein.

2voto

Matt Meikle Punkte 43

Ich bin kürzlich auf dieses Problem gestoßen, während ich einige Software entwickelte, und es fiel mir ein, zu fragen WARUM? Warum haben sie das getan...die Antwort war direkt vor mir. Eine Datenzeile ist ein Objekt, also wenn wir die Objektorientierung beibehalten, sollte das Design für eine bestimmte Zeile getrennt sein (stellen Sie sich vor, Sie müssen die Zeilenanzeige später in der Zukunft wiederverwenden). Also begann ich, datengebundene Stapel und benutzerdefinierte Steuerelemente für die meisten Datenanzeigen zu verwenden. Listen sind gelegentlich aufgetreten, aber meistens wurde das Raster nur für die primäre Seitenaufteilung verwendet (Header, Menübereich, Inhaltsbereich, andere Bereiche). Ihre benutzerdefinierten Objekte können problemlos alle Abstandsanforderungen für jede Zeile im Stapel oder Gitter verwalten (eine einzelne Gitterzelle kann das gesamte Zeilenobjekt enthalten. Dies hat auch den zusätzlichen Vorteil, richtig auf Änderungen in der Ausrichtung, Erweiterungen/Komprimierungen usw. zu reagieren.

oder

Ihre benutzerdefinierten Steuerelemente erben auch den DataContext, wenn Sie Datenbindung verwenden...mein persönlicher Lieblingsvorteil dieses Ansatzes.

1 Stimmen

Was Sie hier versucht haben, ist eine primitive Version der WPF ListView-Steuerelement im GridView-Modus zu erstellen, jedoch ohne die Möglichkeit, alle "RowObjects" dazu zu bringen, die gleiche Spaltenbreite zu teilen. Tatsächlich hat es nicht mehr viel mit einem Raster zu tun.

1voto

Adam Lenda Punkte 691

Eine Möglichkeit wäre, feste Breiten für Zeilen und Spalten hinzuzufügen, die als padding / margin fungieren, nach dem Sie suchen.

Sie könnten auch in Betracht ziehen, dass Sie durch die Größe Ihres Containers eingeschränkt sind und ein Raster so groß wird wie das enthaltende Element oder seine festgelegte Breite und Höhe. Sie könnten einfach Spalten und Zeilen ohne festgelegte Breite oder Höhe verwenden. Auf diese Weise werden sie standardmäßig gleichmäßig den gesamten Platz im Raster aufteilen. Dann wäre es nur noch eine Frage, Ihre Elemente vertikal und horizontal in Ihrem Raster zu zentrieren.

Ein weiterer Weg könnte sein, alle Rasterelemente in einem festen einzelnen Raster mit fester Breite und fester Höhe zu umschließen. Ihr Raster enthält dann Kästchen mit fester Breite / Höhe, die Ihre tatsächlichen Elemente enthalten.

1 Stimmen

Vielen Dank Adam, jedoch ist das Hinzufügen von zusätzlichen Spalten/Zeilen genau das, was ich zu vermeiden versuche. Ich möchte einfach nur meinen Code vereinfachen und die Möglichkeit haben, einen Rand oder Abstand festzulegen würde mir dabei helfen.

0 Stimmen

Sie müssen nur die zusätzlichen Spalten und Zeilen definieren, aber nicht das Markup für sie hinzufügen. Wenn Sie zum Beispiel zwischen 3 Spalten eine Breite von N hinzufügen möchten, würden Sie 5 Spaltendefinitionen haben. Die erste wäre automatische Breite, dann festgelegt, dann automatisch, dann festgelegt, dann automatisch. Weisen Sie dann nur den Spalten 1, 3 und 5 tatsächliche Inhaltelemente zu. Ich verstehe Ihren Standpunkt bezüglich des zusätzlichen Spaltenmarkups, aber es scheint mir trivial, es sei denn, Sie haben Hunderte von Elementen. Deine Entscheidung. Haben Sie auch versucht, ein Stapelpanel von Stapelpaneln mit festgelegten Rändern zu verwenden?

0 Stimmen

Für meinen Fall war das Hinzufügen einer "Splitter/Margin"-Spalte mit Abstand die sauberste und einfachste Lösung. Danke!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X