Почему мой ContentPresenter занимает больше места, чем содержимое, которое он представляет - PullRequest
0 голосов
/ 17 мая 2018

Сейчас я не слишком много знаю о шаблонах элементов управления, но я пытаюсь реализовать один из следующих за статьей по адресу: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/templates/control-templates/creating

Вопрос 1: Насколько я могу судить, ContentPresenter из ControlTemplate просто отображает именно то содержимое, которое определено в представлении, которое потребляет ControlTemplate, не более и не меньше. Правильно ли мое понимание?

Вопрос 2 ( Я постараюсь объяснить ): Если ответ на (1) - «да», почему мой ContentPresenter занимает больше места, чем мой контент? См

screenshot

Мой контент представляет собой StackLayout (зеленый фон) с Grid элементами (розовый фон). Его размеры и положение на скриншоте точно такие, как мне нужно. Тем не менее, мой ContentPresenter (красный фон) выходит за рамки своего содержания (то есть зеленого StackLayout).

Если ответ на (1) отрицательный, могут ли родительские элементы ContentPresenter (т. Е. Другие элементы в ControlTemplate) быть причиной этого?

Любая помощь будет высоко ценится. Спасибо!

Редактировать 1 (код, который я использую):

Данный ContentPresenter относится к ControlTemplate, нацеленному на Xamarin.Forms.Platform.UWP.MasterDetailControl, следующим образом:

<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>

MasterPath=Master выше) происходит от ContentPage с Content, определенным в его коде следующим образом:

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

Редактировать 2 (используется еще несколько стилей):

<Style TargetType="controls:DropShadowPanel" x:Key="MasterMenuDropShadow">
  <Setter Property="Color" Value="#595959"/>
  <Setter Property="OffsetX" Value="-2"/>
  <Setter Property="OffsetY" Value="0"/>
  <Setter Property="BlurRadius" Value="50"/>
  <Setter Property="ShadowOpacity" Value=".7"/>
</Style>

<Style TargetType="Button" x:Key="MenuButton">
  <Setter Property="Width" Value="{StaticResource AppBarThemeCompactHeight}" />
  <Setter Property="Height" Value="{StaticResource AppBarThemeCompactHeight}" />
  <Setter Property="BorderBrush" Value="Transparent" />
  <Setter Property="BorderThickness" Value="0" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Grid Margin="0">
          <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
              <VisualState x:Name="Normal"/>
              <VisualState x:Name="PointerOver">
                <Storyboard>
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Source" Storyboard.TargetName="icon">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Assets\hamburger_onhover.icon.png"/>
                  </ObjectAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>
              <VisualState x:Name="Pressed">
                <Storyboard>
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Source" Storyboard.TargetName="icon">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Assets\hamburger.icon.png"/>
                  </ObjectAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>
              <VisualState x:Name="Disabled" />
            </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <Image Name="icon" Source="Assets\hamburger.icon.png" />
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

1 Ответ

0 голосов
/ 17 мая 2018

Из официального документа,

Для свойства ContentView.Content установлено значение StackLayout, определяющее содержимое, отображаемое на ContentPage. Это содержимое будет отображаться с помощью ContentPresenter, содержащегося в шаблоне TealTemplate.

Для лучшего понимания, пожалуйста, смотрите следующий скриншот. Отображаемое значение 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.

...