我有 TabControl 与 two tabs 包含 lists that should always be scrolled to the bottom :
<TabControl>
<TabItem Header="Tab1">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ListBox x:Name="List1">
<ListBox.ItemTemplate>
<DataTemplate DataType="SampleClass">
<TextBlock Text="{Binding SampleProperty}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
</TabItem>
<TabItem Header="Tab2">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ListBox x:Name="List2">
<ListBox.ItemTemplate>
<DataTemplate DataType="OtherSampleClass">
<TextBlock Text="{Binding SampleProperty}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
</TabItem>
</TabControl>
现在,我设置了事件,以便在绑定更改时,执行以下代码以滚动到列表的底部(取决于选项卡,这是第一个列表的项目更改时发生的情况的示例):
ListBox1.ScrollIntoView(items.Last<SampleClass>());
这很好用 . 更改绑定后,ListBox将按预期滚动到底部 .
但是,当我更改选项卡时设置相同的代码(当选项卡更改时滚动到列表的底部)时,列表不会按预期滚动到底部(并显示在顶部滚动) .
我试着挂钩TabControl的SelectionChanged事件 . 我的猜测是,当执行此事件时,布局尚未呈现,因此调用ScrollIntoView()不会执行任何操作 .
有没有办法解决?
谢谢 .
1 回答
您可以使用具有低优先级的Dispatcher.BeginInvoke延迟ScrollIntoView调用:
现在,在完成输入优先级以上的所有处理之前,实际上不会调用ScrollIntoView .