WP7 - 定位AdControl

时间:2011-11-12 00:24:34

标签: c# windows-phone-7 advertisement expression-blend-4

是否有一种简单的方法可以将AdControl定位在Panorama内?现在,如果我像这样设置对象树,我只能显示我的AdControl:

Layout Root > Panorama > ...
            > AdControl1

也就是说,我的Panorama和我的AdControl都是LayoutRoot的直接子项。

我只想在第一个PanoramaItem上显示我的AdControl,但是当我这样做时,它无法渲染:

LayoutRoot > Panorama > PanoramaItem > StackPanel > ListBox
                                                  > AdControl

也就是说,我希望我的AdControl位于ListBox下面,仅限于该PanoramaItem的底部。我错过了什么?

编辑: XAML,省略了额外的PanoramaItems

工作

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">

        <!--Panorama control-->
        <controls:Panorama Title="bad religion">
            <controls:Panorama.Background>
                <ImageBrush ImageSource="PanoramaBackground.png"/>
            </controls:Panorama.Background>

            <!--Panorama item one-->
            <controls:PanoramaItem Header="content">
                <!--Double line list with text wrapping-->
                <ListBox x:Name="LyricsListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="LyricsListBox_SelectionChanged">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Margin="0,0,0,17" Width="432" Height="78">
                                <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </controls:PanoramaItem>
        </controls:Panorama>
        <my:AdControl AdUnitId="TextAd" ApplicationId="test_client" Height="80" HorizontalAlignment="Left" Margin="0,720,0,0" Name="adControl1" VerticalAlignment="Top" Width="480" />
    </Grid>

不工作

 <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">

        <!--Panorama control-->
        <controls:Panorama Title="bad religion">
            <controls:Panorama.Background>
                <ImageBrush ImageSource="PanoramaBackground.png"/>
            </controls:Panorama.Background>

            <!--Panorama item one-->
            <controls:PanoramaItem Header="content">
                <StackPanel>
                    <!--Double line list with text wrapping-->
                    <ListBox x:Name="LyricsListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="LyricsListBox_SelectionChanged">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Margin="0,0,0,17" Width="432" Height="78">
                                    <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                    <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                    <my:AdControl AdUnitId="TextAd" ApplicationId="test_client" Height="80" HorizontalAlignment="Left" Margin="0,720,0,0" Name="adControl1" VerticalAlignment="Top" Width="480" />
                </StackPanel>
            </controls:PanoramaItem>
        </controls:Panorama>        
    </Grid>

2 个答案:

答案 0 :(得分:2)

您无法看到AdControl的原因是您的保证金设置。

Margin="0,720,0,0" 

将AdControl 720像素从其容器顶部向下放置,在这种情况下是 StackPanel ,而不是LayoutRoot网格。

这意味着AdControl不在屏幕上。

在示例代码中,您可以通过将边距更改为类似的内容来创建临时修复。

Margin="0,420,0,0" 

但这不是一个好的长期解决方案。您应该考虑在网格中对接或使用多行。

另一个考虑因素,如果您使用歌词填充列表框。您是否考虑过使用启用了TextWrapping的文本块?

答案 1 :(得分:1)

如果ListBox正在按照Walt Ritscher的说法将广告控件推离页面底部,则可以选择将其包装在DockPanel而不是StackPanel中将LastChildFill设置为true并将其中元素的顺序反转(以便ListBox为最后一个,因此填充DockPanel的剩余空间而不是扩展StackPanel以占用它满足要求的尺寸。)

就是这样:

<DockPanel LastChildFill="True" ...>
   <my:AdControl/>
   <ListBox/>
</DockPanel>

可能发生这种情况的原因是ListBox会根据内容调整自身的大小(而StackPanel可以使其符合其希望的大小,而不是DockPanel会限制它 - 在这种情况下,在Windows上你添加ScrollViewer,但我不确定你为手机做了什么。

如果是这种情况,您应该会看到截断的ListBoxAdControl。如果没有,AdControl是否会在全景图中显示,或者在堆叠面板中的ListBox上方显示?