更改Tab时,防止TabItem中的ScrollViewer重置偏移量

时间:2016-11-14 15:10:36

标签: wpf tabcontrol scrollviewer tabitem

我有这段代码:

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

每次我更改Tab然后返回时,ScrollViewer会重置其偏移量(到顶部)。使用StackPanel时我错了吗?或者我错过了什么?

感谢。

3 个答案:

答案 0 :(得分:1)

Daniel Leiszen的第一个链接:

  

WPF的默认行为是卸载不可见的项目,包括卸载不可见的TabItems。这意味着当您返回选项卡时,TabItem会重新加载,任何未绑定的内容(例如滚动位置)都将被重置。

在我问之前,我曾想过这个解决方案, 我只想知道一些其他解决方案来帮助我提高知识水平:

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

答案 1 :(得分:0)

这是WPF的预期行为,因为您可以从THIS线程中读取。如果您使用MVVM,您可以使用建议的HERE附加行为绑定滚动查看器的偏移位置,或者如果您更喜欢自定义选项卡控件,则前一个链接包含一个很好的起点。

答案 2 :(得分:0)

我在使用TabControl时遇到了类似的问题。每个选项卡都显示来自UserControl的图形,当我在选项卡之间切换时,滚动查看器在激活选项卡后滚动回原点。

我使用了Onfealive提出的类似方法。但是我使用了Horizo​​ntalOffset和VerticalOffset而不是Tag。

    private void m_ScrollViewer_Loaded(object sender, RoutedEventArgs e)
    {
        m_ScrollViewer.ScrollToHorizontalOffset(m_HorizontalOffset);
        m_ScrollViewer.ScrollToVerticalOffset(m_VerticalOffset);
    }

    private void m_ScrollViewer_Unloaded(object sender, RoutedEventArgs e)
    {
        m_HorizontalOffset = m_ScrollViewer.HorizontalOffset;
        m_VerticalOffset = m_ScrollViewer.VerticalOffset;
    }

这适合我,我认为这种方法更安全!