在整个页面导航中指定弹出位置

时间:2014-12-23 14:48:34

标签: c# windows-phone-8 popup windows-phone orientation

您好我在WP8应用中定位弹出窗口有问题。

我的代码是我已经实例化了一个弹出窗口,其中子窗口是一个用户控件,如:

Popup CenterPopup = new Popup();
LayoutRoot.Children.Add(CenterPopup);
CenterPopup = new UsercontrolElement();

此代码会使我的UsercontrolElement恰好位于中间,因为它在xaml代码的设计视图中查找。问题是我的UsercontrolElement是一个等待屏幕,我想在后面的页面导航中看到它。将弹出窗口添加到LayoutRoot时,这是不可能的。

如果我改为显示弹出窗口并指定大小,那么定位非常困难,我必须通过CompositTransform的反复试验处理用户代码中的LandscapeOrientation。

因此我想知道你是否可以使用上面的代码,但不是将元素添加到LayoutRoot,而是将它放在不仅是页面根目录的东西上,使弹出窗口继续保持其预期位置。 我已经说明了以下问题: enter image description here

这意味着可以完成从后面的代码插入弹出窗口。但它独立于页面。因此,必须为每个pageOrientation定义旋转,并为每个弹出窗口拟合旋转,这不是一个好的解决方案。 的修改

好的,所以我试着玩VisualTreehelper并做到了这一点:

        Border outBorder = (Border)VisualTreeHelper.GetChild(Application.Current.RootVisual, 0);
        ContentPresenter outContent = (ContentPresenter)VisualTreeHelper.GetChild(outBorder, 0);
        outContent.Content = popup;

这给出了上图所需的效果。但是,秒屏幕永远不会加载。那是我有一个永远不会被解雇的loadedEvent。

因此解决方案可能是使用VisualTreeHelper一步,但据我所知这是页面?然后我会回到同样的问题。

任何人都有想法?

3 个答案:

答案 0 :(得分:3)

如果我理解你的问题,可以通过自定义手机应用的PhoneApplicationFrame 风格来实现。

在默认样式ContentTemplate的{​​{1}}内,您会找到一个PhoneApplicationFrame来托管您应用的网页。在这里,您只需创建另一个容器,在此ContentPresenter之上托管您的usercontrol。此外,您不必在此使用ConcentPresenter来托管您的用户控件,我只需将其包含在另一个Popup中。原因是Grid在WP8中存在一些严重的性能问题。如果您将xaml代码放在Popup下方,它将始终位于页面顶部。

ContentPresenter

在上面的示例中,我创建了一个名为<Style TargetType="phone:PhoneApplicationFrame"> <Setter Property="IsTabStop" Value="False" /> <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" /> <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeNormal}" /> <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}" /> <Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="VerticalAlignment" Value="Stretch" /> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> <Setter Property="VerticalContentAlignment" Value="Stretch" /> <Setter Property="Background" Value="Transparent" /> <Setter Property="BorderThickness" Value="0" /> <Setter Property="BorderBrush" Value="{x:Null}" /> <Setter Property="Padding" Value="0" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="phone:PhoneApplicationFrame"> <Border x:Name="ClientArea" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" d:DesignWidth="480" d:DesignHeight="800" Loaded="ClientArea_Loaded"> <Border.Resources> <Storyboard x:Name="ShowTransitionPopup" AutoReverse="True"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="TransitionPopup"> <EasingDoubleKeyFrame KeyTime="0" Value="-124"/> <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0"/> </DoubleAnimationUsingKeyFrames> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="TransitionPopup"> <EasingDoubleKeyFrame KeyTime="0" Value="0"/> <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="1"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </Border.Resources> <Grid> <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" /> <Grid x:Name="TransitionPopup" Canvas.ZIndex="9999" Background="{StaticResource PhoneAccentBrush}" Height="240" Width="360" Opacity="0" RenderTransformOrigin="0.5,0.5" > <!-- put your control here --> <Grid.RenderTransform> <CompositeTransform/> </Grid.RenderTransform> </Grid> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> 的小动画,并在页面导航时调用它(ShowTransitionPopup)。我没有专门编写代码来定位容器,因为只需要处理一个容器,它应该很容易实现。

我已附上工作样本here供您参考。通过按页面底部的导航按钮,您将在UI上看到一个淡入淡出的动画矩形。

希望这有帮助!

答案 1 :(得分:1)

在Windows Phone 8中无法实现。在WinRT 8.1中可以实现。原因是您需要比导航发生的控件更远,这就是Windows Phone 8的PhoneApplicationFrame。documentation

  

     

框架与Windows Phone的外观和感觉集成,因此它看起来像任何其他应用程序。 只有一个框架可供应用程序使用,没有例外。框架包含以下特征:

     

•公开托管页面的属性,例如屏幕方向

     

•公开呈现页面的客户区

     

•公开一个便于在页面之间导航的NavigationService

     

•为状态栏和应用程序栏预留空间

如果您可以在PhoneApplicationFrame上方并托管多个PhoneApplicationFrame,您可以在其中放置一些XAML,以允许您与多个框架交互并在页面导航之间放置一些内容。但是,你不能在Silverlight 8.0中。从表面上看,RootFrame没有父级,因此你甚至无法对其兄弟进行任何其他控制。

如果您愿意构建自己的导航服务(我不建议这样做),您可以使用UserControls在单个页面中模拟这个。

答案 2 :(得分:1)

我不确定但尝试这样的事情。

var activePage = (PhoneApplicationPage) RootFrame.Content;
var pageContent = (Grid) activePage.Content;

UsercontrolElement childpopup = new UsercontrolElement();

Grid.SetRowSpan(childpopup , pageContent.RowDefinitions.Count);
pageContent.Children.Add(childpopup );