WPF - 调用ScrollToHorizo​​ntalOffset()时,ScrollViewer不会滚动

时间:2009-08-10 15:04:16

标签: c# .net wpf xaml scrollviewer

我在TabControl中有一个Scrollviewer,由于某些原因,当你更改标签时,我的ScrollViewer跳转到Horizo​​ntalOffset 12.我的ScrollViewer,其中有一个ListView,其中有一个不受限制的高度。这是一个奇怪的布局,但是卷轴内的所有内容都必须是可打印的,所以我不能轻易地让ListView自行滚动。

所以我在TabControl的SelectionChanged事件中尝试了以下几行:

Console.WriteLine(Scroller.HorizontalOffset);
Scroller.ScrollToHorizontalOffset(0);
Console.WriteLine(Scroller.HorizontalOffset);

对于WriteLine()的两次调用,他们打印出12 ...它也不会移动,但你可以从实际的用户界面滚动。

有谁知道会导致这种奇怪的行为?

我会尝试找到合适的代码发布,但这是一个大型项目,可能很难在示例解决方案中重新创建。

其他信息:

  • 只有在内容足够大且可以水平滚动的情况下才会出现此问题。
  • 我的水平和垂直滚动条可见性为“自动”,但如果将它们设置为“隐藏”或“可见”,则问题仍然存在。

更新:

如果单击ScrollViewer中的ListView并选择一个项目,ScrollViewer将滚动到相同的12像素偏移。我的问题可能与我的ListView获得焦点有关吗? ListView在获得焦点时会自动调用BringIntoView()吗?

这个Xaml重现了这个问题:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window11" Height="300" Width="300">
<TabControl>
    <TabItem Header="Tab One">
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <ListBox Margin="25,0,0,0" Width="2000">
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>          
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            </ListBox>
        </ScrollViewer>
    </TabItem>
    <TabItem Header="Tab Two">
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <ListBox Margin="25,0,0,0" Width="2000">
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>          
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            <ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
            </ListBox>
        </ScrollViewer>
    </TabItem>
</TabControl>
</Window>

在XamlPad中啪嗒一声,运行它。单击Tab标题并注意ScrollViewer自己滚动,使用它并注意ListBox上的边距是如何在屏幕上滚动的。如何防止或解决此问题?在我的例子中,它使我的布局看起来很漂亮。

1 个答案:

答案 0 :(得分:2)

看起来你必须挂钩到RequestBringIntoView:

private void ListView_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
    e.Handled = true;
}

似乎是一个非常简单的解决方案。