1

我在 TabControl 中有一个 Scrollviewer,由于某种原因,当您更改选项卡时,我的 ScrollViewer 会跳转到 12 的 Horizo​​ntalOffset。我的 ScrollViewer 里面有一个高度不受限制的 ListView。这是一个奇怪的布局,但滚动条内的所有内容都必须是可打印的,所以我不能轻易让 ListView 自行滚动。

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

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

他们为对 WriteLine() 的两次调用打印出 12... 它也不会移动,但您可以从实际的 UI 滚动。

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

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

其他信息:

  • 仅当内容足够大且可以水平滚动时才会出现此问题。
  • 我的水平和垂直滚动条可见性是自动的,但是如果将它们设置为隐藏或可见,问题仍然存在。

更新:

如果单击 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 中拍打它,运行它。单击选项卡标题并注意 ScrollViewer 自己滚动,玩弄它并注意我在 ListBox 上的边距是如何滚动到屏幕外的。如何防止或解决此行为?在我的情况下,它使我的布局看起来很笨拙。

4

1 回答 1

2

看起来你必须挂钩到 RequestBringIntoView:

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

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

于 2009-08-10T20:22:51.810 回答