将文本翻译为计算/绝对位置

5
我有一个覆盖整个屏幕的网格,我用Storyboard将其转移到屏幕顶部(或向下)。现在我想做同样的事情,但距离顶部有48px的距离。为了做到这一点,我使用SlideToPosition = -GridContent.ActualHeight + 48;计算SlideToPosition中的顶部位置。当屏幕大小是静态的时候,这是可以的。
问题在于有很多情况下需要重新计算此位置: - 应用程序调整大小 - 方向更改 - 移动设备上屏幕菜单可见
当调整大小时结果也会抖动,有时甚至是错误的。我还尝试使用ApplicationView.GetForCurrentView().VisibleBounds.Top,但这只是使用不同的变量相同。有没有更好的方法将其转换到此位置,而无需一直重新计算变量?

enter image description here

<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>
2个回答

0

你的方法似乎有些不对,因为你基本上是将网格偏移到负位置而不是调整它的大小。

如果你坚持这种方法,我建议你采取以下措施:

在应用程序窗口处于“良好状态”(例如1280x720)时测量其高度。 将网格高度(48px)转换为百分比(48/720=0.0666)。 现在每次计算顶部位置时都要执行:SlideToPosition = AppWindowHeight * 0.666。


我调整了网格的偏移量,因为我想要与解锁屏幕相同的效果,即将整个屏幕向上推。我希望48像素在每种方向/情况下都是固定的。您提供的解决方案给出了一个相对高度,在(例如720)方向中仅为48像素。 - Thomas Schneiter
我建议你不要在那种情况下使用TranslateTransform。当使用负位置时,它似乎不可靠且隐藏在视图中。相反,应该使用动画来改变边距。 - Roy Ben Shabat

0

如果您真的不想调整网格大小,只是将所有内容剪裁出视图,那么您可以使用边距来移动它。

将其向上移动并移出屏幕,并显示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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接