在ScrollViewer的SizeChanged事件上执行UpdateLayout

时间:2013-12-16 17:50:10

标签: silverlight xaml layout silverlight-4.0 scrollbar

已更新 我有一个迟钝的要求,我正在努力完成与现有元素的合作,我正处于一个可以真正使用另一双眼睛的位置。

为了更快解释,有些伪;

<Grid>
  <Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="*"/>
     <RowDefinition Height="Auto"/>
   </Grid.RowDefinitions>

   <Grid/>
   <Grid Grid.Row="1"/>
   <Grid Grid.Row="2"/>

   <Grid Grid.Row="3" Visibility="Collapsed">
      <Grid.RowDefinitions>
         <RowDefinition Height="20"/>
         <RowDefinition Height="*"/>
      </Grid.RowDefinitions>

        <ScrollViewer Grid.Row="1">
          <ItemsControl/>
        </ScrollViewer/>

    </Grid>

</Grid>

所以我们这里有一个父Grid,其子Grid的可见性被切换。目前,父级的行具有自动高度设置,因此当子级消失时,该行会折叠。

最初,孩子只有一个MaxHeight设置,当它可见时,它会调用ScrollViewer滚动条。除了我需要抛弃MaxHeight并让它占用它可用/需要的所有空间,同时在大小改变时调用ScrollViewer上的滚动条。我还应该提一下,我试图在XAML中完成这一切,如果可以的话,没有代码可以支持。

我尝试将EventTrigger绑定到SizeChanged并尝试Loaded并让它CallMethodAction执行UpdateLayout希望它会重新绘制/ {如果需要,请测量ScrollViewer以调用滚动条。然而,没有快乐......

附加到ScrollViewer;

的此类内容
<i:Interaction.Triggers>
   <i:EventTrigger EventName="Loaded">
       <ei:CallMethodAction MethodName="UpdateLayout"/>
   </i:EventTrigger>
</i:Interaction.Triggers>

我希望有一个比我睡得更多的人可以为我的愚蠢或我忘记的事情提供一些见解?看起来像这样的东西应该工作。

所有我需要它做的,仍然尊重Visibility更改并允许父行崩溃,但仍然在可见时调用滚动条并且它是必需的。任何技巧?

PS - 我也在尝试InvalidateArrange&amp; InvalidateMeasure没有运气,我可能在这种情况下错误地使用了CallMethodAction吗?

1 个答案:

答案 0 :(得分:1)

在外部网格中的第二个RowDefinition上设置VerticalAlignment="Top"和没有Height(或Height="*")应该有效:

<Grid VerticalAlignment="Top">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="1" Visibility="Collapsed">
        <Grid.RowDefinitions>
            <RowDefinition Height="20"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <ScrollViewer Grid.Row="1">
            <ItemsControl/>
        </ScrollViewer>
    </Grid>
</Grid>