ScrollViewer удерживает дочерний элемент при панорамировании в UWP

Прокрутка не происходит, когда я панорамирую пользовательский элемент управления. У меня есть настраиваемый элемент управления, полученный из Panel, я поместил его в файл ScrollViewer. И я установил ManipulationMode для своего пользовательского элемента управления как «Все». И активировал ManipulationDelta и изменил VericalOffset и HorizontalOffSet, используя метод ChangeView в ScrollViewer. VerticalOffSet и HorizontalOffSet установлены для моей панели на основе моего панорамирования, но в представлении нет никаких изменений, ScrollViewer удерживает панель.

Я устал от многих способов, но проблема не решена. Запустил ViewChanging и установил VerticalOffSet и HorizontalOffSet. Запустил ManipulationDelta для ScrollViewer и установил VerticalOffSet и HorizontalOffSet. Запустил ManipulationStaring, ManipulationDelta и ManipulationCompleted, установил VerticalOffSet и HorizontalOffSet для CustomPanel и ScrollViewer.

<Grid>
        <ScrollViewer x:Name="scrollViewer" 

                      HorizontalScrollBarVisibility="Visible" 
                      VerticalScrollBarVisibility="Visible"
                      HorizontalAlignment="Left" 
                      VerticalAlignment="Top">
            <local:CustomPanel x:Name="customPanel" Height="800" Width="900"
                               ManipulationMode="All"/>
        </ScrollViewer>
    </Grid>
private void OnContainerOnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {

        if (scrollViewer!= null)
        {
            if (scrollViewer.HorizontalScrollMode == ScrollMode.Disabled && scrollViewer.VerticalScrollMode == ScrollMode.Disabled)
                return;
            var verticalOffset = e.Delta.Translation.Y;
            var horizontalOffset = e.Delta.Translation.X;
           this.scrollViewer.ChangeView(null, VerticalOffset - verticalOffset, null, true);
         this.scrollViewer.ChangeView(HorizontalOffset - horizontalOffset, null, null, true););

            e.Handled = true;
        }

   }

Примечание. У меня есть несколько фиксированных строк в нашей пользовательской сетке (CustomPanel), при прокрутке без установки ManipulationMode фиксированные строки мерцают, поэтому только я активировал ManipulationDelta.

Любое предложение по этому поводу?


person Community    schedule 05.08.2016    source источник


Ответы (1)


Прокрутка не происходит, когда я панорамирую пользовательский элемент управления.

Если я правильно понимаю, я думаю, проблема в том, что значения VerticalOffset - verticalOffset и HorizontalOffset - horizontalOffset не меняются.

И манипуляция обычно взаимодействует с RenderTransform. Если вы хотите панорамировать свой UIElement, вам нужно указать TranslateTransform вашему CustomPanel.

Я сделал демонстрацию и изменил ваши коды, как показано ниже:

public sealed partial class MainPage : Page
{
    private TranslateTransform dragTranslation;
    private double HorizontalOffset;
    private double VerticalOffset;
    public MainPage()
    {
        this.InitializeComponent();
        customPanel.ManipulationDelta += CustomPanel_ManipulationDelta;
        dragTranslation = new TranslateTransform();
        //give a translate transform to customPanel.
        customPanel.RenderTransform = this.dragTranslation;
    }

    private void CustomPanel_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        if (scrollViewer != null)
        {
            if (scrollViewer.HorizontalScrollMode == ScrollMode.Disabled && scrollViewer.VerticalScrollMode == ScrollMode.Disabled)
                return;
            var verticalOffset = e.Delta.Translation.Y;
            var horizontalOffset = e.Delta.Translation.X;
            this.dragTranslation.X += horizontalOffset;
            this.dragTranslation.Y += verticalOffset;
            HorizontalOffset += horizontalOffset;//Here dynamically increase the HorizontalOffset;
            VerticalOffset += verticalOffset;//Here dynamically increase the VerticalOffset;
            this.scrollViewer.ChangeView(null,VerticalOffset, null, true);
            this.scrollViewer.ChangeView(HorizontalOffset, null, null, true);
            e.Handled = true;
        }
    }
}

И XAML:

<ScrollViewer x:Name="scrollViewer" VerticalAlignment="Center"
                  HorizontalScrollBarVisibility="Visible" 
                  VerticalScrollBarVisibility="Visible"
                  HorizontalAlignment="Left" 
                  >
        <local:CustomPanel x:Name="customPanel" Width="800" Height="800" 
                           ManipulationMode="All" VerticalAlignment="Center">
            <TextBlock> Panning Me</TextBlock>
        </local:CustomPanel>
</ScrollViewer>

Как видите, каждый раз, когда срабатывает CustomPanel_ManipulationDelta, я увеличиваю HorizontalOffset и VerticalOffset.

Вот результат:

введите здесь описание изображения

person Elvis Xia - MSFT    schedule 08.08.2016
comment
Элвис - Спасибо за ваше предложение, я проверил ваше предложение на своей стороне в мобильном устройстве, но оно не работает. Есть ли какое-либо решение для достижения моего требования. - person ; 09.08.2016
comment
Может быть, поделитесь базовой демонстрацией, которая может воспроизвести эту проблему, и я постараюсь исправить эту демонстрацию для вас. - person Elvis Xia - MSFT; 09.08.2016