现在我对控制模板了解不多,但我试图按照以下文章实施一个:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/templates/control-templates/creating
问题1:
据我所知,ContentPresenter
的{{1}}只是简单地显示视图中定义的消费ControlTemplate
的内容,或多或少。我的理解是否正确?
问题2(我会尽力解释):
如果(1)的答案为是,为什么我的ControlTemplate
占用的空间比我的内容多?参见
我的内容是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
};
答案 0 :(得分:0)
来自官方文件,
ContentView.Content
属性设置为StackLayout
,用于定义要在ContentPage
上显示的内容。 此内容将由TealTemplate中包含的ContentPresenter
显示。
为了更好地理解,请查看以下屏幕截图。 ContentPresenter
的显示空气是放置在第2行第0-1列的红色块。
您的内容将显示在ContentPresenter
。
<StackLayout BackgroundColor="Green">
<Label Text="Welcome to the app!" HorizontalOptions="Center" />
<Button Text="Change Theme" />
</StackLayout>
所以,第一个问题的答案是正确的。对于第二个问题,您需要发布您的xaml代码。也许您错误地定义了ContentPresenter
的显示区域。