2009-08-10 29 views
0

我在TabControl中有一个Scrollviewer,并且由于某种原因,当您更改选项卡时,我的ScrollViewer跳转到Horizo​​ntalOffset为12.我的ScrollViewer在其中有一个ListView高度不受限制。这是一个奇怪的布局,但滚动条内的所有东西都必须是可打印的,所以我不能轻易让ListView自己滚动。当调用ScrollToHorizo​​ntalOffset()时,WPF - ScrollViewer不会滚动

于是,我在的TabControl的SelectionChanged事件以下行:

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

他们打印出12两个调用的WriteLine()......它也没有动,但你可以滚动来自实际的用户界面。

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

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

其他信息:

  • 的问题仅如果内容足够大,它可以水平滚动发生。
  • 我的水平和垂直滚动条的可见性是自动的,但如果它们被设置为隐藏或可见,问题仍然会发生。

UPDATE:

如果您点击我的ListView那是的ScrollViewer内,选择一个项目,将滚动的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上的边距如何从屏幕滚动。如何防止或解决此问题?这让我的布局看起来非常漂亮。

+0

https://go4answers.webhost4life.com/Example/scrollviewer-scrolltohorizo​​ntaloffset-51429.aspx – 2014-07-16 19:17:57

回答

2

看起来你有挂钩到RequestBringIntoView:

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

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

相关问题