Gegeben ein StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
Was ist der beste Weg, um die untergeordneten Elemente so zu platzieren, dass zwischen ihnen gleich große Lücken bestehen, obwohl die untergeordneten Elemente selbst unterschiedlich groß sind? Kann dies durchgeführt werden, ohne die Eigenschaften für jedes einzelne Kind festzulegen?
wpf
silverlight
xaml
stackpanel
GraemeF
quelle
quelle
Antworten:
Verwenden Sie Rand oder Polsterung, die auf den Bereich innerhalb des Containers angewendet werden:
BEARBEITEN: Wenn Sie den Rand zwischen zwei Containern wiederverwenden möchten, können Sie den Randwert in eine Ressource in einem äußeren Bereich konvertieren, z
und beziehen Sie sich dann auf diesen Wert im inneren Bereich
quelle
Button
.Label
SiePadding
anstelle vonMargin
Ein weiterer netter Ansatz ist hier zu sehen: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between- items-in-stackpanel.aspx Link ist defekt -> dies ist das Webarchiv dieses Links.
Es wird gezeigt, wie ein angehängtes Verhalten erstellt wird, damit die folgende Syntax funktioniert:
Dies ist der einfachste und schnellste Weg, um Margin auf mehrere untergeordnete Elemente eines Panels festzulegen, auch wenn diese nicht vom gleichen Typ sind. (Dh Schaltflächen, Textfelder, Kombinationsfelder usw.)
quelle
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
vor dem eigentlichen Festlegen des Randes des untergeordneten Elements manuell Ränder für einige Elemente festlegen.Ich habe die Antwort von Elad Katz verbessert .
Quellcode im Kern .
Beispiel:
quelle
ItemsControl
Bindung an eine sich ändernde Sammlung. Es wird davon ausgegangen, dass die Elemente ab dem Moment, in dem dasLoad
Ereignis des Elternteils ausgelöst wird, statisch sind .Das, was Sie wirklich tun möchten, ist, alle untergeordneten Elemente zu verpacken. In diesem Fall sollten Sie ein Elementsteuerelement verwenden und nicht auf schreckliche angehängte Eigenschaften zurückgreifen, von denen Sie am Ende eine Million für jede Eigenschaft haben, die Sie stylen möchten.
quelle
Margin="0 0 -5 0"
) abziehen, wird auch der Abstand nach dem letzten Element in der Liste ausgeglichen .+1 für Sergeys Antwort. Und wenn Sie das auf alle Ihre StackPanels anwenden möchten, können Sie dies tun:
Aber Achtung: Wenn Sie einen Stil , wie dies in Ihrem App.xaml (oder ein anderes Wörterbuch , das in die Application.Resources verschmolzen ist) definieren es kann den Standardstil der Steuerung außer Kraft setzen. Für meist unscheinbare Steuerelemente wie das Stackpanel ist dies kein Problem, aber für Textfelder usw. können Sie auf dieses Problem stoßen , das zum Glück einige Problemumgehungen aufweist.
quelle
Gemäß dem Vorschlag von Sergey können Sie einen ganzen Stil (mit verschiedenen Eigenschaftssetzern, einschließlich Rand) definieren und wiederverwenden, anstatt nur ein Objekt für die Dicke:
...
Beachten Sie, dass der Trick hier die Verwendung der Stilvererbung für den impliziten Stil ist, der vom Stil in einem externen (wahrscheinlich aus einer externen XAML-Datei zusammengeführten) Ressourcenwörterbuch erbt.
Randnotiz:
Zuerst habe ich naiv versucht, den impliziten Stil zu verwenden, um die Style-Eigenschaft des Steuerelements auf diese äußere Style-Ressource festzulegen (z. B. mit dem Schlüssel "MyStyle" definiert):
Dies führte dazu, dass Visual Studio 2010 sofort mit dem Fehler CATASTROPHIC FAILURE (HRESULT: 0x8000FFFF (E_UNEXPECTED)) heruntergefahren wurde, wie unter https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails beschrieben -mit-katastrophalem-Fehler-wenn-ein-Stil-versucht-zu-setzen-Stil-Eigenschaft #
quelle
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing sind jetzt in der UWP-Vorschau verfügbar. Alle ermöglichen eine bessere Erfüllung der hier angeforderten Anforderungen.
Diese Eigenschaften sind derzeit nur mit dem Windows 10 Fall Creators Update Insider SDK verfügbar, sollten es aber bis zum Ende schaffen!
quelle
Das UniformGrid ist möglicherweise nicht in Silverlight verfügbar, aber jemand hat es von WPF portiert. http://www.jeff.wilcox.name/2009/01/uniform-grid/
quelle
Mein Ansatz erbt StackPanel.
Verwendung:
Alles was benötigt wird ist die folgende kurze Klasse:
quelle
Manchmal müssen Sie Padding und nicht Margin festlegen, um den Abstand zwischen Elementen kleiner als die Standardeinstellung zu machen
quelle