无法获得活动的垂直滚动条
Can't get an active vertical scrollbar
我已经阅读了很多关于这个问题的帖子,但我无法在我的要求下让它工作。我的计算方式可能存在一些逻辑错误,或者我遗漏了一些关键细节但我看不到。
我得到的是一个滚动条,但它似乎处于非活动状态。我的猜测是,由于标记,网格以其整体呈现,使滚动感觉变得不需要。我怎样才能让它有不同的感觉?
我希望创建一个 window 显示相当长的数据网格,即:
- 高度固定
- 根据宽度调整内容
- 无法调整大小
XAML
<Window ...
SizeToContent="Width"
Height="600"
ResizeMode="NoResize">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="Aaa" Click="Aaa_OnClick" />
<Button Content="Bbb" Click="Bbb_OnClick" />
</StackPanel>
<DataGrid ItemsSource="{Binding Things}"
VerticalScrollBarVisibility="Visible"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Id"
Width="30"
Binding="{Binding Path=Id}" />
<DataGridTextColumn Header="Name"
Width="150"
Binding="{Binding Path=Name}" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</Window>
我错过了什么?
这里的问题是您使用 StackPanel
来包裹您的 DataGrid
。 StackPanel
会增长,直到它可以包含整个 DataGrid
,所以在这种情况下 DataGrid
将其垂直滚动条设置为可见,但实际上它的高度已扩展到足以使滚动条不可见需要出现。如果您将滚动条可见性设置为 Auto
,您将看到它永远不会出现。
您应该改用 Grid
布局,如下所示:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="Aaa" Click="Aaa_OnClick" />
<Button Content="Bbb" Click="Bbb_OnClick" />
</StackPanel>
<DataGrid ItemsSource="{Binding Things}"
VerticalScrollBarVisibility="Visible"
AutoGenerateColumns="False" Grid.Row="1">
<!-- ... -->
</DataGrid>
</Grid>
或者如果你想坚持StackPanel
,你需要在外面包裹一个ScrollViewer,像这样:
<ScrollViewer VerticalScrollBarVisibility="Visible">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="Aaa" Click="Aaa_OnClick" />
<Button Content="Bbb" Click="Bbb_OnClick" />
</StackPanel>
<DataGrid ItemsSource="{Binding Things}"
AutoGenerateColumns="False">
<!-- ... -->
</DataGrid>
</StackPanel>
</ScrollViewer>
我已经阅读了很多关于这个问题的帖子,但我无法在我的要求下让它工作。我的计算方式可能存在一些逻辑错误,或者我遗漏了一些关键细节但我看不到。
我得到的是一个滚动条,但它似乎处于非活动状态。我的猜测是,由于标记,网格以其整体呈现,使滚动感觉变得不需要。我怎样才能让它有不同的感觉?
我希望创建一个 window 显示相当长的数据网格,即:
- 高度固定
- 根据宽度调整内容
- 无法调整大小
XAML
<Window ...
SizeToContent="Width"
Height="600"
ResizeMode="NoResize">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="Aaa" Click="Aaa_OnClick" />
<Button Content="Bbb" Click="Bbb_OnClick" />
</StackPanel>
<DataGrid ItemsSource="{Binding Things}"
VerticalScrollBarVisibility="Visible"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Id"
Width="30"
Binding="{Binding Path=Id}" />
<DataGridTextColumn Header="Name"
Width="150"
Binding="{Binding Path=Name}" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</Window>
我错过了什么?
这里的问题是您使用 StackPanel
来包裹您的 DataGrid
。 StackPanel
会增长,直到它可以包含整个 DataGrid
,所以在这种情况下 DataGrid
将其垂直滚动条设置为可见,但实际上它的高度已扩展到足以使滚动条不可见需要出现。如果您将滚动条可见性设置为 Auto
,您将看到它永远不会出现。
您应该改用 Grid
布局,如下所示:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="Aaa" Click="Aaa_OnClick" />
<Button Content="Bbb" Click="Bbb_OnClick" />
</StackPanel>
<DataGrid ItemsSource="{Binding Things}"
VerticalScrollBarVisibility="Visible"
AutoGenerateColumns="False" Grid.Row="1">
<!-- ... -->
</DataGrid>
</Grid>
或者如果你想坚持StackPanel
,你需要在外面包裹一个ScrollViewer,像这样:
<ScrollViewer VerticalScrollBarVisibility="Visible">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="Aaa" Click="Aaa_OnClick" />
<Button Content="Bbb" Click="Bbb_OnClick" />
</StackPanel>
<DataGrid ItemsSource="{Binding Things}"
AutoGenerateColumns="False">
<!-- ... -->
</DataGrid>
</StackPanel>
</ScrollViewer>