C# 转换到计算/绝对位置

C# 转换到计算/绝对位置,c#,wpf,xaml,uwp,C#,Wpf,Xaml,Uwp,我有一个覆盖整个屏幕的网格,我用故事板将它翻译到屏幕的顶部(或向下)。现在我想做同样的事情,但距离顶部48px。为此,我使用SlideToPosition=-GridContent.ActualHeight+48计算SlideToPosition中的顶部位置。当屏幕大小为静态时,这是正常的 问题是在很多情况下,我必须重新计算这个职位: 应用程序大小调整 方向改变 手机屏幕菜单可见 当调整大小时,结果也是不稳定的,有时甚至是错误的。我还尝试使用ApplicationView.GetForCur

我有一个覆盖整个屏幕的网格,我用故事板将它翻译到屏幕的顶部(或向下)。现在我想做同样的事情,但距离顶部48px。为此,我使用
SlideToPosition=-GridContent.ActualHeight+48计算
SlideToPosition
中的顶部位置。当屏幕大小为静态时,这是正常的

问题是在很多情况下,我必须重新计算这个职位:

  • 应用程序大小调整
  • 方向改变
  • 手机屏幕菜单可见
当调整大小时,结果也是不稳定的,有时甚至是错误的。我还尝试使用
ApplicationView.GetForCurrentView().VisibleBounds.Top
,但对于不同的变量,这是相同的。有没有更好的方法来转换到这个位置,而不必一直重新计算变量


您的方法在这里似乎有点不合适,因为您基本上是将网格偏移到负位置,而不是调整网格的大小

如果你坚持这种方法,我建议如下:

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

如果您确实不想调整网格大小,只想将视图中的所有内容都剪裁掉,可以使用边距将其移动。 将其向上移出屏幕并显示48像素(heightToShow)

然后,当您想将其向后移动时,可以输入正常边距(topMargin)


我偏移了网格,因为我想要与解锁屏幕相同的效果,例如,将整个屏幕向上推。我希望48px在每个方向/情况下都能固定。您的解决方案给出的相对高度在(例如720)方向上仅为48px。在这种情况下,我建议您不要使用TranslateTransform。当使用从视图中隐藏的负位置时,它似乎不可靠。改为设置页边距的动画。
<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>
private void MoveGridUp(double heightToShow)
    {
        double gridHeight = GridContent.ActualHeight;
        Thickness margin = GridContent.Margin;
        margin.Top = heightToShow - gridHeight;
        GridContent.Margin = margin;
    }
private void MoveGridDown(double topMargin)
    {
        Thickness margin = GridContent.Margin;
        margin.Top = topMargin;
        GridContent.Margin = margin;
    }