在UWP中平移时,ScrollViewer保留子元素

在UWP中平移时,ScrollViewer保留子元素,uwp,panel,panning,Uwp,Panel,Panning,平移自定义控件时不会发生滚动。我有一个自定义控件,它是从面板派生的,我将此控件放置在滚动查看器中。我已经将自定义控件的操作模式设置为“All”。并通过使用ScrollViewer中的ChangeView方法触发OperationDelta并更改VericalOffset和HorizontalOffSet。垂直偏移和水平偏移是根据我的平移为我的面板设置的,但是在视图中没有更改,ScrollViewer保留面板 我用了很多方法,但问题没有解决。触发了视图更改,并设置了垂直偏移和水平偏移。触发Scro

平移自定义控件时不会发生滚动。我有一个自定义控件,它是从面板派生的,我将此控件放置在
滚动查看器中。我已经将自定义控件的
操作模式设置为“All”。并通过使用
ScrollViewer
中的
ChangeView
方法触发
OperationDelta
并更改
VericalOffset
HorizontalOffSet
。垂直偏移和水平偏移是根据我的平移为我的面板设置的,但是在视图中没有更改,
ScrollViewer
保留面板

我用了很多方法,但问题没有解决。触发了
视图更改
,并设置了
垂直偏移
水平偏移
。触发
ScrollViewer
OperationDelta
,并设置
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;
        }

   }

私有void OnContainerOnManipulationDelta(对象发送方,操纵DeltaRouteDeventargs e)
{
如果(scrollViewer!=null)
{
if(scrollViewer.HorizontalScrollMode==ScrollMode.Disabled&&scrollViewer.VerticalScrollMode==ScrollMode.Disabled)
返回;
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、 已处理=正确;
}
}
注意:我在自定义网格(CustomPanel)中有一些固定行,在滚动时未设置
操作模式
固定行闪烁,因此只有我触发了
操作增量

有什么建议吗

平移自定义控件时不会发生滚动

如果我理解正确,我认为问题在于
VerticalOffset-VerticalOffset
horizontalcoffset-horizontalcoffset
的值没有改变

而操纵通常与渲染转换相配合。如果要平移UIElement,则需要为
CustomPanel
提供一个
TranslateTransform

我制作了一个演示并修改了您的代码,如下所示:

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\u操作delta
时,我都会增加
水平偏移量
垂直偏移量

结果如下:


Elvis-感谢您的建议,我已经在移动设备中查看了您的建议,但它不起作用。是否有任何解决方案可以满足我的要求。也许可以共享一个可以重现此问题的基本演示,我将尝试为您修复该演示。