Bagaimana cara mengatur ketinggian WPF ScrollViewer secara dinamis?

Saya memiliki sampel tes berikut:

<Window x:Class="WpfScrollTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="200" Width="200">
    <Border>
        <StackPanel>
            <Label Width="Auto" Height="Auto" Content="Text to mess up the scrollview"/>
                <ScrollViewer Height="{Binding RelativeSource={RelativeSource FindAncestor, 
                        AncestorType={x:Type Border}}, Path=ActualHeight}">
                    <StackPanel>
                        <Button MinWidth="100" MinHeight="100" Content="Button"/>
                        <Button MinWidth="100" MinHeight="100" Content="Button"/>
                    </StackPanel>
                </ScrollViewer>
            </StackPanel>
    </Border>
</Window>

Yang menciptakan ini:

Scrollbar bagian bawah hilang

Pertanyaan saya adalah bagaimana cara mengatur ScrollViewer.Height secara dinamis sambil tetap dapat melihat bagian bawah scrollbar? Dalam sampel saya, Height dari ScrollViewer terlalu panjang karena Label di atasnya..

Saya tidak ingin memperbaiki Height dari ScrollViewer menjadi nilai statis.


person Andrew Keith    schedule 19.10.2009    source sumber


Jawaban (1)


Saya akan merekomendasikan untuk menghapus StackPanel bagian luar ke Grid, karena Stackpanel tidak akan mengikuti ukuran anak-anak. Dan hapus pengikatan ScrollViewer.Height. Sekarang Anda hanya perlu membuat dua RowDefinition untuk Grid dan menempatkan Label ke Grid.Row=0 dan ScrollViwer ke Grid.Row=1.

Kode ada di bawah. Jadi tip saya di sini adalah, gunakan StackPanel/Canvas hanya jika diperlukan dan mungkin untuk level dalam. Coba gunakan Grid lebih banyak untuk mendapatkan tata letak yang sangat dinamis.

  <Border>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Width="Auto" Height="Auto" Content="Text to mess up the scrollview"/>
        <ScrollViewer Grid.Row="1" >
            <StackPanel>
                <Button MinWidth="100" MinHeight="100" Content="Button"/>
                <Button MinWidth="100" MinHeight="100" Content="Button"/>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Border>
person Jobi Joy    schedule 19.10.2009
comment
hei, itu berhasil. Saya sekarang mengerti bahwa karena RowDefinition untuk ScrollViewer adalah *, sehingga memiliki ukuran yang ditentukan dan dengan demikian berfungsi. Terima kasih :) - person Andrew Keith; 20.10.2009