Анимация прокрутки Hub

Я написал Присоединенное свойство, чтобы иметь возможность привязать индекс отображаемого HubSection к моей ViewModel, чтобы я мог изменить его в своем коде.

Я использую метод ScrollTo(section) Hub, но он не анимирует прокрутку, поэтому я решил использовать ScrollViewer внутри Hub с методом ChangeView.

Бывает так, что имея 4 HubSection просто пролистывает до второго перед зависанием.

viewer.HorizontalOffset остается фиксированным на уровне 360 (то есть ActualWidth у HubSection), и изменить его невозможно!

Вот код, который я использую для анимации прокрутки:

async private static Task ScrollHubToSection(Hub hub, HubSection section, int index)
{
    var dispatcher = hub.Dispatcher;            
    var viewer = hub.GetDescendantsOfType<ScrollViewer>().First();
    var offset = index*section.ActualWidth;                   
    await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => viewer.ChangeView(offset, null, null, false));
}

(GetDescendantsOfType от WinRTXamlToolkit.Controls.Extensions)

Чего я ожидаю, так это вызова

ScrollHubSection(myHub, section1, 1)

следует прокрутить viewer до HorizontalOffset из 360, а

ScrollHubSection(myHub, section2, 2)

offset правильно становится 720) по-прежнему остается HorizontalOffset до 360, что совершенно бессмысленно.

Если я вручную вставлю смещение, выполнив

viewer.ChangeView(1000, null, null, false));

это идет к HorizontalOffset из 1000, но если я это сделаю

viewer.ChangeView(offset, null, null, false));

когда offset равно 1000, это не работает.

Это действительно сводит меня с ума, потому что я потратил впустую весь день, безуспешно пытаясь это исправить.

Не могли бы вы мне помочь?


person StepTNT    schedule 08.11.2014    source источник


Ответы (1)


Вы можете сделать это так.

async private static Task ScrollHubToSection(Hub hub, HubSection section, int index)
{
    var dispatcher = hub.Dispatcher;            
    var viewer = hub.GetDescendantsOfType<ScrollViewer>().First();
    double offset = 0; 
    for (int i = 0; i < index; i++)
    {
        offset += hub.Sections[i].ActualWidth;
    }                  
    await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => viewer.ChangeView(offset, null, null, false));
}
person Jeevaraj    schedule 02.02.2015