我在 TabControl 中有一个 Scrollviewer,由于某种原因,当您更改选项卡时,我的 ScrollViewer 会跳转到 12 的 HorizontalOffset。我的 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 上的边距是如何滚动到屏幕外的。如何防止或解决此行为?在我的情况下,它使我的布局看起来很笨拙。