转换为计算/绝对位置

时间:2016-11-17 12:42:39

标签: c# wpf xaml uwp

我有一个覆盖整个屏幕的网格,我用故事板将其翻译到屏幕的顶部(或向后)。现在我想做同样但距离顶部48px的距离。为此,我使用SlideToPosition计算SlideToPosition = -GridContent.ActualHeight + 48;中的最高排名。当屏幕尺寸是静态时,这是可以的。

  

问题是有很多情况,我必须重新计算这个位置:

     
      
  • app resizing
  •   
  • 方向更改
  •   
  • 可见的移动屏幕菜单
  •   
     

在调整大小时,结果也是紧张的,有时候也是错误的。我也尝试使用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 :(得分:0)

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

如果你坚持这种方法而不是我建议如下:

当应用程序窗口高度处于良好状态时测量它的高度&#34; (例如1280x720)。 将网格高度(48px)转换为百分比(48/720 = 0.0666)。 现在每次想要计算顶部位置时:SlideToPosition = AppWindowHeight * 0.666。

答案 1 :(得分: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;
    }