2009-08-10 5 views
0

J'ai un Scrollviewer dans un TabControl, et pour une raison quelconque lorsque vous changez d'onglet, mon ScrollViewer passe à HorizontalOffset de 12. Mon ScrollViewer, entre autres choses, a un ListView dedans avec une hauteur illimitée. C'est une mise en page étrange, mais tout ce qui se trouvait à l'intérieur du défilement devait être imprimable, donc je ne pouvais pas facilement laisser le ListView faire défiler tout seul.WPF - ScrollViewer ne défile pas lorsque ScrollToHorizontalOffset() est appelé

J'ai donc essayé les lignes suivantes en cas SelectionChanged du TabControl:

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

Et ils impriment 12 pour les appels à WriteLine() ... Il ne bouge pas, mais vous pouvez faire défiler de l'interface utilisateur réelle.

Est-ce que quelqu'un sait ce qui causerait ce comportement étrange?

Je vais essayer de trouver le code approprié pour poster, mais c'est un grand projet et il pourrait être difficile à recréer dans une solution d'échantillon.

Autres infos:

  • Le problème ne se produit que si le contenu est assez grand où il peut horizontalement défiler.
  • Ma visibilité horizontale et verticale de la barre de défilement est Auto, mais le problème persiste si elles sont définies sur Caché ou Visible.

MISE À JOUR:

Si vous cliquez sur mon ListView qui est à l'intérieur du ScrollViewer et sélectionnez un élément, les rouleaux ScrollViewer à ce même 12 décalage pixel. Mon problème peut-il être lié à l'activation de mon ListView? Est-ce qu'un ListView appelle BringIntoView() sur lui-même quand il reçoit le focus?

Cette Xaml reproduit la question:

<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> 

Slap cela dans XamlPad, exécutez. Cliquez sur un en-tête Tab et notez le scroll ScrollViewer par lui-même, jouez avec et remarquez comment ma marge sur le ListBox est défilée hors de l'écran. Comment puis-je empêcher ou contourner ce problème? Cela rend ma mise en page plutôt joviale dans mon cas.

+0

https://go4answers.webhost4life.com/Example/scrollviewer-scrolltohorizontaloffset-51429.aspx –

Répondre

2

On dirait que vous devez accrocher dans RequestBringIntoView:

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

On dirait une solution assez simple.

Questions connexes