Biorąc pod uwagę StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
Jaki jest najlepszy sposób na rozmieszczenie elementów potomnych, aby między nimi były równej wielkości przerwy, mimo że same elementy potomne mają różne rozmiary? Czy można to zrobić bez ustawiania właściwości dla poszczególnych dzieci?
wpf
silverlight
xaml
stackpanel
GraemeF
źródło
źródło
Odpowiedzi:
Użyj marginesu lub wypełnienia, zastosowanych do zakresu w kontenerze:
EDYCJA: Jeśli chcesz ponownie użyć marginesu między dwoma kontenerami, możesz przekonwertować wartość marginesu na zasób w zakresie zewnętrznym, np.
a następnie odnoszą się do tej wartości w wewnętrznym zakresie
źródło
Button
.Label
, musisz użyćPadding
zamiastMargin
Inne fajne podejście można zobaczyć tutaj: 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 jest zepsuty -> to jest webarchive tego linku.
Pokazuje, jak utworzyć załączone zachowanie, aby działała taka składnia:
Jest to najłatwiejszy i najszybszy sposób ustawienia marginesu na kilka elementów podrzędnych panelu, nawet jeśli nie są tego samego typu. (Tj. Przyciski, TextBoxes, ComboBoxes itp.)
źródło
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
przed faktycznym ustawieniem marginesu dziecka pozwala ręcznie określić marginesy dla niektórych elementów.Poprawiłem odpowiedź Elad Katz .
Kod źródłowy w gist .
Przykład:
źródło
ItemsControl
powiązaniu ze zmieniającą się kolekcją. Zakłada, że przedmioty są statyczne od momentu uruchomieniaLoad
zdarzenia przez rodzica .Naprawdę chcesz owinąć wszystkie elementy potomne. W takim przypadku powinieneś użyć kontroli przedmiotów i nie uciekać się do okropnie przywiązanych właściwości, które ostatecznie będą miały milion za każdą nieruchomość, którą chcesz stylizować.
źródło
Margin="0 0 -5 0"
) również przeciwdziała odstępowi po ostatnim elemencie na liście.+1 za odpowiedź Siergieja. A jeśli chcesz zastosować to do wszystkich swoich StackPanels, możesz to zrobić:
Ale uwaga: jeśli zdefiniujesz taki styl w App.xaml (lub innym słowniku połączonym z Application.Resources), może on zastąpić domyślny styl formantu. W przypadku większości nie wyglądających elementów sterujących, takich jak panel sterujący, nie stanowi to problemu, ale w przypadku pól tekstowych itp. Można natknąć się na ten problem , który na szczęście zawiera pewne obejścia.
źródło
Postępując zgodnie z sugestią Siergieja, możesz zdefiniować i ponownie wykorzystać cały Styl (z różnymi ustawieniami właściwości, w tym Margines) zamiast tylko obiektu Grubość:
...
Zwróć uwagę, że sztuczka polega na użyciu dziedziczenia stylu dla stylu niejawnego, dziedziczącego po stylu w jakimś zewnętrznym (prawdopodobnie scalonym z zewnętrznego pliku XAML) słowniku zasobów.
Dygresja:
Najpierw naiwnie próbowałem użyć stylu niejawnego, aby ustawić właściwość Style kontrolki na ten zewnętrzny zasób stylu (powiedzmy zdefiniowany za pomocą klucza „MyStyle”):
który spowodował natychmiastowe zamknięcie programu Visual Studio 2010 z błędem CATASTROPHIC FAILURE (HRESULT: 0x8000FFFF (E_UNEXPECTED)), jak opisano na https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails -with-katastroficzna awaria-kiedy-styl-próbuje-ustawić-właściwość-styl #
źródło
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing są teraz na podglądzie UWP, wszystko pozwoli lepiej zrealizować to, co jest wymagane.
Te właściwości są obecnie dostępne tylko z Windows 10 Fall Creators Update Insider SDK, ale powinny dotrzeć do ostatnich kawałków!
źródło
UniformGrid może nie być dostępny w Silverlight, ale ktoś przeportował go z WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/
źródło
Moje podejście dziedziczy StackPanel.
Stosowanie:
Potrzebne są tylko następujące krótkie klasy:
źródło
czasem trzeba ustawić Wypełnienie, a nie Margines, aby zmniejszyć odstęp między przedmiotami niż domyślny
źródło