您好我在WP8应用中定位弹出窗口有问题。
我的代码是我已经实例化了一个弹出窗口,其中子窗口是一个用户控件,如:
Popup CenterPopup = new Popup();
LayoutRoot.Children.Add(CenterPopup);
CenterPopup = new UsercontrolElement();
此代码会使我的UsercontrolElement
恰好位于中间,因为它在xaml代码的设计视图中查找。问题是我的UsercontrolElement
是一个等待屏幕,我想在后面的页面导航中看到它。将弹出窗口添加到LayoutRoot时,这是不可能的。
如果我改为显示弹出窗口并指定大小,那么定位非常困难,我必须通过CompositTransform的反复试验处理用户代码中的LandscapeOrientation。
因此我想知道你是否可以使用上面的代码,但不是将元素添加到LayoutRoot,而是将它放在不仅是页面根目录的东西上,使弹出窗口继续保持其预期位置。 我已经说明了以下问题:
这意味着可以完成从后面的代码插入弹出窗口。但它独立于页面。因此,必须为每个pageOrientation定义旋转,并为每个弹出窗口拟合旋转,这不是一个好的解决方案。 的修改
好的,所以我试着玩VisualTreehelper并做到了这一点:
Border outBorder = (Border)VisualTreeHelper.GetChild(Application.Current.RootVisual, 0);
ContentPresenter outContent = (ContentPresenter)VisualTreeHelper.GetChild(outBorder, 0);
outContent.Content = popup;
这给出了上图所需的效果。但是,秒屏幕永远不会加载。那是我有一个永远不会被解雇的loadedEvent。
因此解决方案可能是使用VisualTreeHelper一步,但据我所知这是页面?然后我会回到同样的问题。
任何人都有想法?
答案 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 );