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