转换为计算/绝对位置

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;
    

【讨论】:

以上是关于转换为计算/绝对位置的主要内容,如果未能解决你的问题,请参考以下文章

C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧 (转)

为啥从Vue.js中的列表中删除项目时移动转换需要绝对位置

将字符串转换为核心位置

我可以使用 CSS 过渡为绝对定位元素设置动画吗?

文件操作

在使用 Bootstrap 悬停时使用“位置:绝对”切换或更改图像