2009-10-19 2 views
0

У меня есть следующий образец теста:WPF ScrollViewer изменение размера смещения проблема

<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> 

который создает это:

Scrollbar bottom missing http://img33.imageshack.us/img33/8200/scrolloffsetmissing.jpg

Мой вопрос, как я могу установить ScrollViewer.Height динамически в то время как еще в состоянии см. нижнюю часть полосы прокрутки? В моем образце, то Height из ScrollViewer слишком долго из-за Label над ним ..

Я не хочу, чтобы исправить Height в ScrollViewer к статическому значению.

ответ

1

Я бы рекомендовал удалить внешнюю StackPanel в сетку, так как Stackpanel не будет уважать размер детей. И удалите привязку ScrollViewer.Height. Теперь вам просто нужно создать два RowDefinition для Grid и поместить метку в Grid.Row = 0 и ScrollViwer в Grid.Row = 1.

Код приведен ниже. Поэтому мой совет: используйте StackPanel/Canvas только в случае необходимости и, возможно, для внутренних уровней. Попытайтесь использовать Grid больше, чтобы получить очень динамичные макеты.

<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> 
+0

эй, это работает. Теперь я вижу, что, поскольку RowDefinition для ScrollViewer *, поэтому он имеет определенный размер и, следовательно, работает. Благодаря :) –