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.

100voto

Charlie Punkte 14841

RowDefinition und ColumnDefinition sind vom Typ ContentElement, und Margin ist streng genommen eine Eigenschaft von FrameworkElement. Also auf deine Frage, "ist es einfach möglich", ist die Antwort ein klares Nein. Und nein, ich habe keine Layout-Panels gesehen, die diese Art von Funktionalität demonstrieren.

Sie können zusätzliche Zeilen oder Spalten hinzufügen, wie Sie vorgeschlagen haben. Sie können jedoch auch Margins auf einem Grid-Element selbst setzen oder auf alles, was innerhalb eines Grid stehen würde, das ist also der beste Workaround im Moment.

3 Stimmen

OP versucht nicht, einen Rand auf RowDefinition oder ColumnDefinition festzulegen. Er versucht, einen Rand auf die visuellen Kinder des Rasters festzulegen, die von FrameworkElement abgeleitet sind.

96voto

samad Punkte 849

Verwenden Sie eine Border-Steuerung außerhalb der Zellensteuerung und definieren Sie die Polsterung dafür:

                <Setter Property="Padding" Value="5,5,5,5" />

Quelle:

2 Stimmen

@RichardEverett Überprüfen Sie die Way Back Machine: Link aktualisiert in der Antwort.

2 Stimmen

Ich finde diese Antwort am besten. Sie bietet eine Lösung für die ursprüngliche Frage und ist einfach und unkompliziert. Danke!

2 Stimmen

Dies ist einfach und praktisch

20voto

JayGee Punkte 333

Sie könnten etwas wie das verwenden:

  <Setter Property="Padding" Value="4" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
          <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</code></pre>

<p></p>

<p>Oder wenn Sie die TemplateBindings nicht benötigen:</p>

<pre><code><Style TargetType="{x:Type DataGridCell}">
   <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="{x:Type DataGridCell}">
              <Border Padding="4">
                  <ContentPresenter />
              </Border>
          </ControlTemplate>
      </Setter.Value>
  </Setter>

33 Stimmen

Danke JayGee, jedoch ist diese Lösung für das DataGrid - nicht für das Standard Grid-Control.

0 Stimmen

Durch Klicken auf den Padding-Bereich wird die Reihe nicht mehr ausgewählt.

8voto

Ich dachte, ich würde meine eigene Lösung hinzufügen, weil noch niemand dies erwähnt hat. Anstatt ein UserControl basierend auf Grid zu entwerfen, können Sie Steuerelemente, die in einem Raster enthalten sind, mit einer Style-Deklaration ansprechen. Es kümmert sich darum, Padding/Margin zu allen Elementen hinzuzufügen, ohne sie für jedes einzelne definieren zu müssen, was umständlich und arbeitsintensiv ist. Wenn Ihr Raster beispielsweise nur TextBlocks enthält, können Sie Folgendes tun:

    <Setter Property="Margin" Value="10"/>

Was dem Äquivalent von "Zellenpadding" entspricht.

0 Stimmen

Trickle down? Zum Beispiel, wenn Sie ein StackPanel in einer Rasterzeile haben, erben die Textblock-Kinder des StackPanels diese Eigenschaft?

0 Stimmen

Nicht sicher, ob es über die unmittelbaren Kinder hinwegrieselt, aber das können Sie mit einem einfachen Test herausfinden.

2 Stimmen

@Maslow Die Antwort lautet absolut "Ja", aber deine Formulierung ist etwas irreführend. Es gibt kein "Vererben" der Margin-Eigenschaft, vielmehr wird jeder Style in einem ResourceDictionary auf jedes Element seines TargetType überall innerhalb des gesamten Bereichs des Besitzerelements dieses Wörterbuchs angewendet. Es sind also die Styles, die sich verbreiten, nicht die Eigenschaft.

4voto

AntonB Punkte 2505

Ich bin überrascht, dass ich diese Lösung noch nicht gepostet gesehen habe.

Aus dem Web kommend, verwenden Frameworks wie Bootstrap einen negativen Rand, um Zeilen/Spalten zurückzuziehen.

Es mag etwas ausführlich sein (wenn auch nicht so schlimm), aber es funktioniert und die Elemente sind gleichmäßig platziert und dimensioniert.

Im folgenden Beispiel verwende ich eine StackPanel root, um zu demonstrieren, wie die 3 Schaltflächen gleichmäßig platziert sind, indem ich Ränder verwende. Sie könnten auch andere Elemente verwenden, ändern Sie einfach den inneren x:Type von Button zu Ihrem Element.

Die Idee ist einfach: Verwenden Sie ein Raster nach außen, um die Ränder der Elemente um die Hälfte der inneren Menge des Rasters hinauszuziehen (unter Verwendung negativer Ränder), und verwenden Sie das innere Raster, um die Elemente gleichmäßig mit der gewünschten Menge zu platzieren.

Update: Ein Benutzerkommentar besagt, dass es nicht funktioniert, hier ist ein kurzes Video zur Demonstration: https://youtu.be/rPx2OdtSOYI

Die Bildbeschreibung hier eingeben

                    <Setter Property="Margin" Value="-5 0"/>

                        <Setter Property="Margin" Value="10 0"/>

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