2009-08-10 67 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; 
} 

似乎是一個非常簡單的解決方案。

相關問題