WPF TabControl / ScrollIntoView问题

时间:2010-06-11 14:44:13

标签: .net wpf tabcontrol

我有 TabControl 两个标签包含应始终滚动到底部的列表

    <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 个答案:

答案 0 :(得分:4)

您可以使用优先级较低的Dispatcher.BeginInvoke延迟ScrollIntoView调用:

Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
  ListBox1.ScrollIntoView(items.Last());
}));

现在,在完成输入优先级以上的所有处理之前,实际上不会调用ScrollIntoView。