转换为计算/绝对位置
Posted
技术标签:
【中文标题】转换为计算/绝对位置【英文标题】:Translating to a calculated / absolute position 【发布时间】:2017-04-01 00:18:27 【问题描述】:我有一个覆盖整个屏幕的网格,我用情节提要将它翻译到屏幕顶部(或向后)。现在我想做同样的事情,但距离顶部 48px。为此,我用SlideToPosition = -GridContent.ActualHeight + 48;
计算SlideToPosition
中的最高位置。当屏幕尺寸为静态时,这是可以的。
问题是有很多情况,我必须重新计算这个位置:
应用调整大小 方向改变 移动屏幕菜单可见调整大小时结果也很紧张,有时甚至是错误的。我也尝试使用
ApplicationView.GetForCurrentView().VisibleBounds.Top
,但这与不同的变量相同。有没有更好的方法来转换到这个位置,而不必一直重新计算变量?
<Grid Name="GridContent">
<Grid Name="GridTranslate">
<Grid.RenderTransform>
<TranslateTransform x:Name="TranslateTransformContent" />
</Grid.RenderTransform>
</Grid>
</Grid>
<Storyboard x:Name="StoryboardUp">
<DoubleAnimation Storyboard.TargetName="TranslateTransformContent" Storyboard.TargetProperty="Y" To="x:Bind Path=SlideToPosition, Mode=OneWay" Duration="0:0:0.4">
</Storyboard>
<Storyboard x:Name="StoryboardDown">
<DoubleAnimation Storyboard.TargetName="TranslateTransformContent" Storyboard.TargetProperty="Y" To="0" Duration="0:0:0.4">
</Storyboard>
【问题讨论】:
【参考方案1】:您的方法在这里似乎有点偏离,因为您基本上是将网格偏移到负位置而不是调整它的大小。
如果你坚持这种方法,我建议如下:
测量处于“良好状态”(例如 1280x720)的应用程序窗口的高度。 将网格高度 (48px) 转换为百分比 (48 / 720 = 0.0666)。 现在每次要计算顶部位置时,请执行以下操作:SlideToPosition = AppWindowHeight * 0.666。
【讨论】:
我偏移了网格,因为我想要与解锁屏幕相同的效果,例如你将整个屏幕向上推。我希望 48px 在每个方向/情况下都能得到修复。您的解决方案给了我一个相对高度,在(例如 720)方向上只有 48px。 我建议您不要在这种情况下使用 TranslateTransform。当使用隐藏在视图中的负位置时,它似乎不可靠。而是为边距设置动画。【参考方案2】:如果您真的不想调整网格大小而只是将所有内容从视图中剪掉,您可以使用边距来移动它。 将其向上移出屏幕并显示 48 像素 (heightToShow)
private void MoveGridUp(double heightToShow)
double gridHeight = GridContent.ActualHeight;
Thickness margin = GridContent.Margin;
margin.Top = heightToShow - gridHeight;
GridContent.Margin = margin;
然后当你想往回移动时你可以输入正常的边距(topMargin)
private void MoveGridDown(double topMargin)
Thickness margin = GridContent.Margin;
margin.Top = topMargin;
GridContent.Margin = margin;
【讨论】:
以上是关于转换为计算/绝对位置的主要内容,如果未能解决你的问题,请参考以下文章