Diberikan StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
Apa cara terbaik untuk memisahkan elemen-elemen anak sehingga ada celah yang berukuran sama di antara mereka, meskipun elemen-elemen anak itu sendiri memiliki ukuran yang berbeda? Bisakah itu dilakukan tanpa menetapkan properti pada masing-masing anak?
wpf
silverlight
xaml
stackpanel
GraemeF
sumber
sumber
Jawaban:
Gunakan Margin atau Padding, diterapkan pada ruang lingkup dalam wadah:
EDIT: Jika Anda ingin menggunakan kembali margin antara dua kontainer, Anda dapat mengkonversi nilai margin ke sumber daya dalam lingkup luar,
dan kemudian merujuk pada nilai ini di lingkup dalam
sumber
Button
.Label
Anda harus menggunakanPadding
bukanMargin
Pendekatan lain yang bagus bisa dilihat di sini: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between- items-in-stackpanel.aspx Tautan rusak -> ini adalah webarchive dari tautan ini.
Ini menunjukkan cara membuat perilaku terlampir, sehingga sintaksis seperti ini berfungsi:
Ini adalah cara termudah & tercepat untuk mengatur Margin ke beberapa anak panel, bahkan jika mereka tidak dari jenis yang sama. (Yaitu Tombol, Kotak Teks, Kotak Kombo, dll.)
sumber
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
sebelum benar-benar mengatur margin anak itu memungkinkan untuk secara manual menentukan margin untuk beberapa elemen.Saya memperbaiki jawaban Elad Katz .
Kode sumber dalam inti .
Contoh:
sumber
ItemsControl
terikat pada koleksi yang berubah. Diasumsikan bahwa barang-barang itu statis sejak saat acara induknyaLoad
menyala.Hal yang benar-benar ingin Anda lakukan adalah membungkus semua elemen anak. Dalam hal ini Anda harus menggunakan kontrol item dan tidak menggunakan properti terlampir yang mengerikan yang pada akhirnya Anda akan memiliki jutaan properti yang ingin Anda ciptakan.
sumber
Margin="0 0 -5 0"
) juga akan melawan jarak setelah item terakhir dalam daftar.+1 untuk jawaban Sergey. Dan jika Anda ingin menerapkannya pada semua StackPanels Anda, Anda dapat melakukan ini:
Namun berhati-hatilah: jika Anda mendefinisikan gaya seperti ini di App.xaml Anda (atau kamus lain yang digabungkan ke dalam Aplikasi. Sumber) itu dapat mengganti gaya default kontrol. Untuk sebagian besar kontrol yang tidak terlihat seperti stackpanel itu bukan masalah, tetapi untuk kotak teks dll Anda mungkin menemukan masalah ini , yang untungnya memiliki beberapa solusi.
sumber
Menindaklanjuti saran Sergey, Anda dapat menentukan dan menggunakan kembali seluruh Gaya (dengan berbagai setter properti, termasuk Margin) alih-alih hanya objek Ketebalan:
...
Perhatikan bahwa trik di sini adalah penggunaan Style Inheritance untuk style implisit, yang diturunkan dari style di kamus sumber daya luar (mungkin digabung dari file XAML eksternal).
Sidenote:
Pada awalnya, saya secara naif mencoba menggunakan gaya implisit untuk mengatur properti Style dari kontrol ke sumber daya Style luar (katakanlah didefinisikan dengan kunci "MyStyle"):
yang menyebabkan Visual Studio 2010 segera ditutup dengan kesalahan CATASTROPHIC FAILURE (HRESULT: 0x8000FFFF (E_UNEXPECTED)), seperti yang dijelaskan di https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails -dengan-bencana-kegagalan-ketika-gaya-mencoba-untuk-mengatur-gaya-properti #
sumber
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing sekarang di pratinjau UWP, semua akan memungkinkan untuk lebih memahami apa yang diminta di sini.
Properti ini saat ini hanya tersedia dengan Windows 10 Fall Creators Update Insider SDK, tetapi harus membuatnya ke bit akhir!
sumber
UniformGrid mungkin tidak tersedia di Silverlight, tetapi seseorang telah porting dari WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/
sumber
Pendekatan saya mewarisi StackPanel.
Pemakaian:
Yang dibutuhkan hanyalah kelas pendek berikut:
sumber
terkadang Anda perlu mengatur Padding, bukan Margin untuk membuat ruang antar item lebih kecil dari standar
sumber