为什么我的ContentPresenter占用的空间超出了它所呈现的内容

时间:2018-05-16 23:55:52

标签: xamarin.forms uwp controltemplate contentpresenter

现在我对控制模板了解不多,但我试图按照以下文章实施一个:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/templates/control-templates/creating

问题1: 据我所知,ContentPresenter的{​​{1}}只是简单地显示视图中定义的消费ControlTemplate的内容,或多或少。我的理解是否正确?

问题2(我会尽力解释): 如果(1)的答案为是,为什么我的ControlTemplate占用的空间比我的内容多?参见

screenshot

我的内容是ContentPresenter(绿色背景),其中包含StackLayout元素(粉色背景)。它在显示的屏幕截图中的尺寸和位置完全符合我的要求。但是,我的Grid(红色背景)正在扩展超出其内容(绿色ContentPresenter)。

如果(1)的答案为否,StackLayout的父元素(即ContentPresenter中的其他元素)是否可能导致此问题?

非常感谢任何帮助。谢谢!

编辑1(代码I' m using):

有问题的ControlTemplate属于ContentPresenter目标Xamarin.Forms.Platform.UWP.MasterDetailControl,如下所示:

ControlTemplate

<Style TargetType="uwp:MasterDetailControl"> <Setter Property="ToolbarForeground" Value="{ThemeResource DefaultTextForegroundThemeBrush}" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="uwp:MasterDetailControl"> <SplitView PaneBackground="Transparent" x:Name="SplitView" IsPaneOpen="{Binding IsPaneOpen,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}" DisplayMode="Overlay"> <SplitView.Pane> <Grid HorizontalAlignment="Left"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal" Visibility="{TemplateBinding MasterToolbarVisibility}"> <Button Name="PaneTogglePane" Style="{StaticResource MenuButton}"/> </StackPanel> <controls:DropShadowPanel Grid.Row="1" Style="{StaticResource MasterMenuDropShadow}" Margin="12.5,0,0,0"> <StackPanel Background="Yellow"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Image Grid.Column="0" Source="Assets\master_menu_pointer.png" /> <StackPanel Grid.Column="1" /> </Grid> <ContentPresenter Padding="0" Background="Red" Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Master}" Margin="0,-1,0,0" /> </StackPanel> </controls:DropShadowPanel> </Grid> </SplitView.Pane> (在上面的Master中)来自Path=Master,其代码中定义了ContentPage,如下所示:

Content

编辑2(使用了更多样式):

Content = new StackLayout
{
  Children = {_firstPinkChild, _secondPinkChild},
  Padding = 15,
  Margin = 0,
  Orientation = StackOrientation.Horizontal,
  BackgroundColor = Color.Green,
  HorizontalOptions = LayoutOptions.Start,
  VerticalOptions = LayoutOptions.Start
};

1 个答案:

答案 0 :(得分:0)

来自官方文件,

  

ContentView.Content属性设置为StackLayout,用于定义要在ContentPage上显示的内容。 此内容将由TealTemplate中包含的 ContentPresenter显示。

为了更好地理解,请查看以下屏幕截图。 ContentPresenter的显示空气是放置在第2行第0-1列的红色块。

enter image description here

您的内容将显示在ContentPresenter

<StackLayout BackgroundColor="Green">
    <Label Text="Welcome to the app!" HorizontalOptions="Center" />
    <Button Text="Change Theme"  />
</StackLayout>

所以,第一个问题的答案是正确的。对于第二个问题,您需要发布您的xaml代码。也许您错误地定义了ContentPresenter的显示区域。