【问题标题】:Performing UpdateLayout on SizeChanged event of ScrollViewer对 ScrollViewer 的 SizeChanged 事件执行 UpdateLayout
【发布时间】:2013-12-16 17:50:09
【问题描述】:

更新 我有一个迟钝的要求,我正在尝试使用现有元素来满足我的需求,而且我真的可以使用另一双眼睛。

为了更快的解释,一些伪;

<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 和 InvalidateMeasure 但没有运气,我可能在这种情况下错误地使用了 CallMethodAction 吗?

【问题讨论】:

  • 您不能从外部网格的第二行中删除Height="Auto" 设置吗?这将使该行完全填充可用空间并自动切换滚动条。
  • @Clemens 然后当填充它的内容被折叠时,它会保持原来的大小,留下一个漂亮的大空白空间。不幸的是,尝试了许多不同的方法。
  • 好的,如果您还在外部网格上设置VerticalAlignment="Top",它应该可以工作。

标签: silverlight xaml layout silverlight-4.0 scrollbar


【解决方案1】:

在外部 Grid 的第二个 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>

【讨论】:

  • 我更新了问题中的布局,我认为这几行可以传达示例,但我不认为。不幸的是,这仍然留下一个空间并且不调用滚动条,所以我假设它上面的 * 在父级有效果?令人惊讶的是,看似最愚蠢的事情如何成为*$#中最大的痛苦,哈哈
  • 您是否只是混淆了索引?第 3 行有 Height="*",但折叠的内部 Grid 有第 4 行 Grid.Row="3"
  • 不,它的设置方式是满足当时要求的一种临时方式,但它并没有真正做到它的作用。因此,您可以在所有行的内容上切换可见性,但 * 一个会在其他行展开/折叠时推动其他行,因此可以使中心在其周围的内容被切入和切出时占用更多或更少的空间。 (我知道,我知道……)
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多