2016-11-14 18 views
0

У меня есть этот код:Предотвращение ScrollViewer в TabItem сброс смещения при изменении Tab

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

Каждый раз, когда я изменить Tab затем вернуться, сбросить ScrollViewer его смещение (в верхней части). Я ошибаюсь при использовании StackPanel? Или я что-то пропустил?

Спасибо.

ответ

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

Я думаю, я дал вам два разных решения, привязка (что я лично предпочитаю) подходит, когда вы используете MVVM (и я предлагаю вам это сделать) и пользовательский элемент управления. Они являются действительными и многоразовыми решениями. Вы можете, конечно, сохранить положение прокрутки где-нибудь еще, например. свойство Tag. Я бы не стал предлагать это, поскольку это не общее решение и сложнее повторно использовать код, когда вам нужно где-то еще. В любом случае, из вашего вопроса неясно, что у вас уже есть ответ на это. Мой плохой, извините за ответ. –

+0

@ DanielLeiszen Я узнаю больше, чтобы понять о 2 этом решении. Возможно, я смогу использовать их в будущем. Благодарю. – Onfealive

+0

Этот файл работает (на Loaded and Unloaded). Нелегко даже решить проблему. Смотрел и искал то, что в коде устанавливало положение 0 все время при переключении вкладок. – Wolf5

0

Это ожидаемое поведение WPF, поскольку вы можете читать поток THIS. Если вы используете MVVM, вы можете привязать позицию смещения средства просмотра прокрутки, используя предложенное поведение HERE, или, если вы предпочитаете настраивать элемент управления вкладками, первая ссылка содержит хорошую отправную точку.

+0

Я пробовал, но он, вероятно, не работает со мной. – Onfealive

0

У меня была аналогичная проблема с TabControl. На каждой вкладке отображаются графики из UserControl, и когда я переключался между вкладками, средство просмотра прокрутки прокручивалось назад до начала координат после активации вкладки.

Я использовал аналогичный подход, предложенный Onfealive. Но вместо тега я использовал HorizontalOffset и VerticalOffset.

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

Это работает для меня, и я думаю, что этот подход безопаснее!