Katakanlah saya ingin TextBlock
memiliki yang Width
setara dengan Parent-nya Width
(yaitu, membentang dari sisi ke sisi) atau persentase dari itu Parent Container Width
, bagaimana saya bisa mencapai ini XAML
tanpa menentukan nilai absolut?
Saya ingin melakukan ini sehingga jika wadah Induk kemudian diperluas (' Width
meningkat),' Elemen Anak-nya juga akan diperluas secara otomatis. (pada dasarnya, seperti dalam HTML dan CSS)
Jawaban:
Cara untuk merentangkannya ke ukuran yang sama dengan wadah induk adalah dengan menggunakan atribut:
Itu akan membuat elemen Textbox membentang secara horizontal dan mengisi semua ruang induk secara horizontal (sebenarnya itu tergantung pada panel induk yang Anda gunakan tetapi harus bekerja untuk sebagian besar kasus).
Persentase hanya dapat digunakan dengan nilai sel kisi sehingga opsi lain adalah membuat kisi dan meletakkan kotak teks Anda di salah satu sel dengan persentase yang sesuai.
sumber
Anda bisa meletakkan kotak teks di dalam kisi untuk melakukan nilai persentase pada baris atau kolom kisi dan membiarkan kotak teks mengisi otomatis ke sel induknya (seperti yang akan secara default). Contoh:
Ini akan membuat # 1 2/5 dari lebarnya, dan # 2 3/5.
sumber
Biasanya, Anda akan menggunakan kontrol tata letak bawaan yang sesuai untuk skenario Anda (mis. Gunakan kisi sebagai orangtua jika Anda ingin menskalakan relatif terhadap induk). Jika Anda ingin melakukannya dengan elemen induk sewenang-wenang, Anda bisa membuat ValueConverter melakukannya, tetapi mungkin tidak akan sebersih yang Anda inginkan. Namun, jika Anda benar-benar membutuhkannya, Anda dapat melakukan sesuatu seperti ini:
Yang dapat digunakan seperti ini, untuk mendapatkan kotak teks anak 10% dari lebar kanvas induknya:
sumber
CultureInfo.InvariantCulture
untuk menambahkan konversi ganda karenaparameter
dianggap sebagaistring
dan dalam budaya yang berbedadecimal separator
itu tidak akan berfungsi seperti yang diharapkan.Bagi siapa saja yang mendapatkan kesalahan seperti: string '2 *' tidak dapat dikonversi ke Panjang.
sumber
<RowDefinition Height="auto" />
?Implementasi IValueConverter dapat digunakan. Kelas konverter yang mengambil warisan dari IValueConverter mengambil beberapa parameter seperti
value
(persentase) danparameter
(lebar induk) dan mengembalikan nilai lebar yang diinginkan. Dalam file XAML, lebar komponen diatur dengan yang diinginkan dengan nilai:XAML:
sumber
Saya tahu ini bukan Xaml tapi saya melakukan hal yang sama dengan event SizeChanged dari textbox:
Kotak teks tampaknya berukuran 80% dari induknya (margin sisi kanan adalah 20%) dan membentang bila diperlukan.
sumber
Saya menggunakan dua metode untuk ukuran relatif. Saya memiliki kelas yang disebut
Relative
dengan tiga properti terlampirTo
,WidthPercent
danHeightPercent
yang berguna jika saya ingin sebuah elemen menjadi ukuran relatif dari suatu elemen di mana saja di pohon visual dan terasa kurang hacky daripada pendekatan konverter - meskipun menggunakan apa yang bekerja untuk Anda, bahwa Anda senang dengan.Pendekatan lain agak lebih licik. Tambahkan di
ViewBox
mana Anda ingin ukuran relatif di dalam, lalu di dalam itu, tambahkanGrid
pada lebar 100. Kemudian jika Anda menambahkanTextBlock
dengan lebar 10 di dalamnya, itu jelas 10% dari 100.The
ViewBox
akan skala yangGrid
sesuai dengan apa pun ruang yang telah diberikan, jadi jika yang satu-satunya hal pada halaman, makaGrid
akan ditingkatkan keluar lebar penuh dan efektif, AndaTextBlock
adalah skala untuk 10% dari halaman.Jika Anda tidak mengatur ketinggian pada
Grid
maka itu akan menyusut agar sesuai dengan isinya, jadi semuanya akan berukuran relatif. Anda harus memastikan bahwa kontennya tidak terlalu tinggi, yaitu mulai mengubah rasio aspek dari ruang yang diberikan kepada yangViewBox
lain itu akan mulai mengukur ketinggian juga. Anda mungkin dapat bekerja di sekitar ini denganStretch
dariUniformToFill
.sumber