Search code examples
wpftabcontrolscrollviewertabitem

Prevent ScrollViewer in TabItem reset offset when changing Tab


I have this code:

<TabItem Header="Card Details">
    <ScrollViewer Name="cardDetailsScroll" MaxHeight="600" Width="Auto" Padding="10">
        <StackPanel>
            <Canvas Height="50">
            </Canvas>
            ...
        </StackPanel>
    </ScrollViewer>
</TabItem>

Each time I change Tab then come back, the ScrollViewer reset its offset (to the top). Am I wrong when using StackPanel? Or did I miss something?

Thanks.


Solution

  • From the Daniel Leiszen's first link:

    The default behavior of WPF is to unload items which are not visible, which includes unloading TabItems which are not visible. This means when you go back to the tab, the TabItem gets re-loaded, and anything not bound (such as a scroll position) will get reset.

    I had thought this solution before I asked, I just want to know a few other solutions to help me improve knowledge:

    private void cardDetailsScroll_Loaded(object sender, RoutedEventArgs e)
    {
        double offset;
        if (cardDetailsScroll.Tag != null 
             && double.TryParse(cardDetailsScroll.Tag.ToString(), out offset))
        {
            cardDetailsScroll.ScrollToVerticalOffset(offset);                
        }
    }
    
    private void cardDetailsScroll_Unloaded(object sender, RoutedEventArgs e)
    {
        cardDetailsScroll.Tag = cardDetailsScroll.VerticalOffset;
    }