ItemsControl中的ScrollViewer - ScrollBar未显示但正在工作

时间:2011-10-13 12:11:10

标签: c# .net wpf

这不是你的平均“我的ScrollViewer不工作”的问题...
假设一个带网格的窗口。第0列和第1行的大小设置为Auto,第1列和第0行设置为*。 (重要)
在单元格[0,0]中,ItemsControl内的StackPanel内有一个ScrollViewer的模板Grid。原因很简单:如果不能显示ItemsControl中的所有项目,则显示滚动条。垂直滚动条的可见性设置为Auto(重要) 在Cell [1,1]中,有Button显示其宽度。

如果窗口太小也会显示ItemsControl中的所有项目,这将导致以下情况: 滚动条将在那里,但它不可见。它正在工作,因为我可以使用鼠标滚轮滚动。原因似乎是包含ItemsControl的网格列不会自动扩展以为滚动条腾出空间。

如果我更改(几乎)任何参数,滚动条将按预期显示,第二列的大小将减小。 任何人都可以解释这种奇怪的行为吗?


其他信息:

以下参数更改将导致滚动条变为可见:

  1. 将第0列的大小更改为*
  2. 将第1列的大小更改为Auto
  3. 将第1行的大小更改为*
  4. 删除Button
  5. Button移至[0,1]或[1,0]
  6. 手动设置ItemsControl
  7. 的宽度
  8. VerticalScrollBarVisibilityScrollViewer的{​​{1}}设置为ItemsControl
  9. 但是,将[1,1]中的按钮更改为其他内容,例如另一个Visible不会改变奇怪的行为,所以它与按钮无关。此外,将ItemsControl的宽度更改为小于第二列的内容,也不会删除该行为。


    完整的复制示例代码:

    Button

1 个答案:

答案 0 :(得分:2)

看起来它可能是WPF中的已知错误。 This question处理ListBox的ScrollViewer,但我认为主体是相同的。

作为替代方案,你可以在ScrollViewer后面添加一些东西,它的宽度绑定到ScrollViewer的ActualWidth,这会强制列绘制正确的大小

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

    <ScrollViewer x:Name="Test" Grid.Row="0" Grid.Column="0" 
                  VerticalScrollBarVisibility="Auto">
        <Button Content="Column1" Height="500" />
    </ScrollViewer>

    <Grid Grid.Column="0" Grid.Row="0" 
          Width="{Binding ElementName=Test, Path=ActualWidth}" />

    <Button Content="{Binding ActualWidth, RelativeSource={RelativeSource Self}}"
        Grid.Column="1" Grid.Row="1" />
</Grid>