2016-12-31 7 views
1

Я создал страницу, которая принимает некоторые данные о местоположении (включая Lat/Long), а затем отображает карту и детали для этого. С кодом он отображает пользовательский интерфейс в Android-эмуляторе. При попытке сделать это в XAML я не могу заставить его отображаться правильно - несмотря на попытку скопировать код в XAML как можно лучше.Xamarin Xaml StackLayout over Map

Код:

public class TestDetailPage : ContentPage 
{ 

    public TestDetailPage(TripLogEntry entry) { 

     Title = "Entry Details"; 
     var mainLayout = new Grid 
     { 
      RowDefinitions = { 
       new RowDefinition { Height = new GridLength (4, GridUnitType.Star) }, 
       new RowDefinition { Height = GridLength.Auto }, 
       new RowDefinition { Height = new GridLength (1, GridUnitType.Star) }} 
     }; 

     var map = new Map(); 
     // Center the map around the log entry's location 
     map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(entry.Latitude, entry.Longitude), Distance.FromMiles(.5))); 
     // Place a pin on the map for the log entry's location 
     map.Pins.Add(new Pin 
     { 
      Type = PinType.Place, 
      Label = entry.Title, 
      Position = new Position(entry.Latitude, entry.Longitude) 
     }); 
     var title = new Label 
     { 
      HorizontalOptions = LayoutOptions.Center 
     }; 
     title.Text = entry.Title; 
     var date = new Label 
     { 
      HorizontalOptions = LayoutOptions.Center 
     }; 
     date.Text = entry.Date.ToString("M"); 
     var rating = new Label 
     { 
      HorizontalOptions = LayoutOptions.Center 
     }; 
     rating.Text = $"{entry.Rating} star rating"; 
     var notes = new Label 
     { 
      HorizontalOptions = LayoutOptions.Center 
     }; 
     notes.Text = entry.Notes; 
     var details = new StackLayout 
     { 
      Padding = 10, 
      Children = { title, date, rating, notes } 
     }; 
     var detailsBg = new BoxView 
     { 
      BackgroundColor = Color.White, 
      Opacity = .8 
     }; 
     mainLayout.Children.Add(map); 
     mainLayout.Children.Add(detailsBg, 0, 1); 
     mainLayout.Children.Add(details, 0, 1); 
     Grid.SetRowSpan(map, 3); 
     Content = mainLayout; 
    } 
} 

Это делает как: Map when using code

С XAML ниже он делает, как показано:

<?xml version="1.0" encoding="utf-8" ?> 
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     x:Class="TripLog.Pages.DetailPage" Title="Entry Details" 
     xmlns:map="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"> 
    <ContentPage.Content> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="4*" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="1*" /> 
     </Grid.RowDefinitions>  
     <map:Map x:Name="DetailMap" Grid.RowSpan="3" /> 
     <BoxView x:Name="DetailsBG" BackgroundColor="Color.White" Grid.Row="0" Grid.Column="1" /> 
     <StackLayout Padding="10" Grid.Row="0" Grid.Column="1"> 
     <Label x:Name="EntryTitle" /> 
     <Label x:Name="EntryDate" /> 
     <Label x:Name="EntryRating" /> 
     <Label x:Name="EntryNotes" /> 
     </StackLayout>   
    </Grid>  
    </ContentPage.Content> 
</ContentPage> 

Map when using XAML

Как вы можете видеть, я попытался скопировать код в XAML, но безрезультатно. Пожалуйста, можете ли вы помочь получить один и тот же рендеринг пользовательского интерфейса, когда это делается в коде для XAML?

Спасибо в продвижении.

ответ

0

аргументы Grid.Children.Add(Element, Col, Row), что может противоречить интуиции. В вашем XAML вы переносите значения столбца и строки.

попробуйте переключить его:

<BoxView x:Name="DetailsBG" BackgroundColor="Color.White" Grid.Row="1" Grid.Column="0" /> 
    <StackLayout Padding="10" Grid.Row="1" Grid.Column="0"> 
+0

Это работало. Большое спасибо за это Джейсон. Я получал Grid.Row = "1" Grid.Column = "0", смешанный в XAML. –

Смежные вопросы