Формы Xamarin: Могу ли я создать собственный шаблон, который можно динамически изменять на разных страницах? - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь создать своего рода шаблон с заголовком и телом, в котором тело полностью реализовано страницей, а в заголовке есть области, которые могут быть добавлены страницей.

I 'В настоящее время я экспериментирую с ControlTemplate, который выглядит следующим образом:

  <ControlTemplate x:Key="HeaderTemplate">
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition Height="10*" />
        <RowDefinition Height="90*" />
      </Grid.RowDefinitions>

      <Grid Grid.Row="0">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="10*" />
          <ColumnDefinition Width="60*" />
          <ColumnDefinition Width="30*" />
        </Grid.ColumnDefinitions>

        <BoxView BackgroundColor="{DynamicResource PrimaryColor}" Grid.ColumnSpan="3" />

        <StackLayout x:Name="LeftHeaderArea" Orientation="Horizontal" Grid.Column="0" />
        <Label Text="{DynamicResource HeaderTitle}" TextColor="White" VerticalOptions="Center" Grid.Column="1" />
        <StackLayout x:Name="RightHeaderArea" Orientation="Horizontal" Grid.Column="2" />
      </Grid>

      <ContentPresenter Grid.Row="1" />
    </Grid>
  </ControlTemplate>

Я могу использовать этот ControlTemplate в своих представлениях и страницах XAML для построения тела, но я не нашел никакого способа получить доступ к LeftHeaderArea илиRightHeaderArea чтобы добавить к ним элементы управления.

1 Ответ

0 голосов
/ 13 марта 2019

Вместо того, чтобы каждая страница вставляла элементы управления в заголовок, мы решили позволить заголовку определить все возможные элементы управления и сделать видимыми только те, которые доступны на данной странице.

Например, мой вопросRightHeaderArea был изменен, чтобы выглядеть следующим образом:

        <StackLayout Spacing="10" HorizontalOptions="End" Orientation="Horizontal" Grid.Column="2">
          <svg:SvgCachedImage VerticalOptions="Center" WidthRequest="30" HeightRequest="30" 
                              IsVisible="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToBoolConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadHistory}}" 
                              Source="resource://Uploader.Images.icon-viewUploadHistory.svg">
            <svg:SvgCachedImage.GestureRecognizers>
              <TapGestureRecognizer Command="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToCommandConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadHistory}}" />
            </svg:SvgCachedImage.GestureRecognizers>
          </svg:SvgCachedImage>

          <svg:SvgCachedImage VerticalOptions="Center" WidthRequest="35" HeightRequest="35"
                              IsVisible="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToBoolConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadQueue}}" 
                              Source="resource://Uploader.Images.icon-viewUploadQueue.svg">
            <svg:SvgCachedImage.GestureRecognizers>
              <TapGestureRecognizer Command="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToCommandConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadQueue}}" />
            </svg:SvgCachedImage.GestureRecognizers>
          </svg:SvgCachedImage>

          <svg:SvgCachedImage Grid.Column="2" VerticalOptions="Center" WidthRequest="60" HeightRequest="50" 
                              IsVisible="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToBoolConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.Upload}}" 
                              Source="resource://Uploader.Images.icon-upload.svg">
            <svg:SvgCachedImage.GestureRecognizers>
              <TapGestureRecognizer Command="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToCommandConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.Upload}}" />
            </svg:SvgCachedImage.GestureRecognizers>
          </svg:SvgCachedImage>
        </StackLayout>

Все мои ViewModels имеют открытое свойство AvailableToolbarCommands, которое является List<ToolbarCommandLink>, где ToolbarCommandLink является простым классом, который содержит Commandи пользовательское значение перечисления (ToolbarCommandName).

Чтобы все это работало, это конвертеры.tclsToBoolConverter возвращает true, если значение (List) содержит ToolbarCommandLink с именем, соответствующим параметру (ToolbarCommandName);tclsToCommandConverter возвращает Команду в ToolbarCommandLink, которую он находит в значении (List), которое соответствует параметру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...