Как заполнить этот пользовательский интерфейс в формах Xamarin? - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу выполнить это UI в Xamarin Forms .Это скриншот моего UI .

enter image description here

Так что я понятия не имею, как это сделать UI в формах хамарина .Я запутался, это cardview или просто view , в который я должен добавить все эти images и ярлыки .Мне нужны предложения по реализации этого UI .

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вы можете создать «CardView», используя макет «Рамка», доступный в Xamarin.Forms.

Код выглядит следующим образом:

CardViewTemplate.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App68.CardViewTemplate">
    <ContentView.Content>
        <Frame IsClippedToBounds="True"  
           HasShadow="True"  
           Margin="30"
           BorderColor="White"
           BackgroundColor="White" >
            <Frame.OutlineColor>
                <OnPlatform x:TypeArguments="Color"  
                    Android="Gray"  
                    iOS="Gray"/>
            </Frame.OutlineColor>
            <Frame.Margin>
                <OnPlatform x:TypeArguments="Thickness"  
                     Android="10"   
                     iOS="10"/>
            </Frame.Margin>
            <StackLayout Orientation="Horizontal">

                <Grid VerticalOptions="CenterAndExpand"  
                 Padding="0"  
                 HorizontalOptions="FillAndExpand"  
                 BackgroundColor="Transparent">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="25" />
                        <RowDefinition Height="25" />
                        <RowDefinition Height="25" />
                        <RowDefinition Height="25" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Image Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" Source="{Binding PreviewImage}" />
                    <Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Text="{Binding RestaurantName}" />
                    <Label Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3" Text="{Binding Address}"  />
                    <Label Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" Text="{Binding FoodTypes}" />
                    <Label Grid.Row="3" Grid.Column="1" Text="{Binding Rating}" />
                    <Label Grid.Row="3" Grid.Column="2" Text="{Binding Time}" />
                    <Label Grid.Row="3" Grid.Column="3" Text="{Binding Distance}" />
                   </Grid>
            </StackLayout>
        </Frame>
    </ContentView.Content>
</ContentView>

MainPage.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"
             xmlns:local="clr-namespace:App68"
             x:Class="App68.MainPage">

    <StackLayout Orientation="Vertical">
        <Label Text="CardView Demo in Xamarin Forms"  
               FontAttributes="Bold"  
               FontSize="Medium"  
               VerticalOptions="Start"  
               HorizontalTextAlignment="Center"  
               VerticalTextAlignment="Center"  
               BackgroundColor="Transparent"  
               HorizontalOptions="CenterAndExpand" />
        <ListView x:Name="listView"   
                  SelectedItem="{Binding SelcetedItem,Mode=TwoWay}"   
                  HasUnevenRows="True"  
                  ItemsSource="{Binding lstRestaurants}" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <local:CardViewTemplate/>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>

</ContentPage>

Restaurant.cs

using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;

namespace App68
{
    class Restaurant
    {
        public String PreviewImage { get; set; }
        public string RestaurantName { get; set; }
        public bool IsFavorite { get; set; }
        public string Address { get; set; }
        public string FoodTypes { get; set; }
        public Image RatingIcon { get; set; }
        public double Rating { get; set; }
        public Image TimeIcon { get; set; }
        public double Time { get; set; }
        public Image DistanceIcon { get; set; }
        public double Distance { get; set; }
    }
}

RestaurantViewModel.cs

using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;

namespace App68
{
    class RestaurantViewModel
    {
        public IList<Restaurant> lstRestaurants { get; set; }
        public object SelectedItem { get; set; }
        public RestaurantViewModel()
        {
            lstRestaurants = new List<Restaurant>();
            GenerateCardModel();
        }

        private void GenerateCardModel()
        {
            var restaurant1 = new Restaurant()
            {
                PreviewImage = "Restaurant_1.jpg",
                RestaurantName = "Premera restaurant",
                IsFavorite = true,
                Address = "Avenue Road 256",
                FoodTypes = "India Italy Chinese kitchen",
                Rating = 4.3,
                Time = 150,
                Distance = 3
            };

            lstRestaurants.Add(restaurant1);

            var restaurant2 = new Restaurant()
            {
                PreviewImage = "Restaurant_2.jpg",
                RestaurantName = "Premera restaurant",
                IsFavorite = true,
                Address = "Avenue Road 256",
                FoodTypes = "India Italy Chinese kitchen",
                Rating = 4.3,
                Time = 150,
                Distance = 3
            };

            lstRestaurants.Add(restaurant2);
        }
    }
}

Эффект заключается в следующем:

enter image description here

0 голосов
/ 27 ноября 2018

Я использовал XFXCardview для этого интерфейса.И, кажется, работает довольно хорошо. Это ссылка на GitHub .Так что это изменения, которые я сделал в своем коде -

 <xfx:XfxCardView 
                        BackgroundColor="White"
                        CornerRadius="30" 
                    Elevation="20"
                 HeightRequest="150" IsClippedToBounds="True">
                    <Grid RowSpacing="0" >
                        <Grid ColumnSpacing="0">
                            <Grid.RowDefinitions >
                                <RowDefinition Height="2*"></RowDefinition>
                                <RowDefinition Height="*"></RowDefinition>

                                <RowDefinition Height="Auto"></RowDefinition>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>

                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <Frame Margin="10,10,10,-20" Padding="-30" CornerRadius="10" Grid.RowSpan="3"  BackgroundColor="LightBlue"  IsClippedToBounds="True">
                                <Image Margin="-70,0,0,0"  Grid.Row="0" Grid.Column="0" Grid.RowSpan="3"  BackgroundColor="AliceBlue"  Source="restaurantimage1.jpg"  />
                            </Frame>
                            <Label Grid.Row="0" Grid.Column="1" Margin="0,30,30,0"  HorizontalOptions="Start" Text="Premera restaurant" TextColor="Black" FontFamily="Bold,20"/>
                            <Image Grid.Row="0" Grid.Column="1" Margin="0,30,10,0" HorizontalOptions="End" Source="whitehearticon3.jpg"/>
                            <Label Grid.Row="1" Grid.Column="1" Margin="0,-20,40,0"  HorizontalTextAlignment="Start" Text="Avenue Road,256" TextColor="Blue"/>
                            <Label Grid.Row="2" Grid.Column="1" Margin="0,-40,40,0"  VerticalTextAlignment="Start" Text="Indian,Italy,Chinese Kitchen" TextColor="LightGray"/>

                            <Image Grid.Row="3" Grid.Column="1" Margin="0,-20,30,0" Source="whitestaricon1.png" WidthRequest="10" HeightRequest="10" BackgroundColor="Blue"/>
                            <Label Grid.Row="3" Grid.Column="1" Margin="0,-20,40,0" HorizontalTextAlignment="Center" Text="4,3"/>
                        </Grid>
                    </Grid>
                </xfx:XfxCardView>
0 голосов
/ 22 ноября 2018

Я предполагаю, что у вас будет несколько ресторанов в качестве какого-либо результата поиска, и, вероятно, представление будет прокручиваться, если результатов много?

Я бы реализовал это с помощью ListView:

<ListView ItemsSource="{Binding Restaurants} HasUnevenRows="True">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell Height="100">
                <Grid>
                     <Grid.RowDefinitions>
                         <RowDefinition Height="*">
                         <RowDefinition Height="*">
                         <RowDefinition Height="*">
                         <RowDefinition Height="*">
                     </Grid.RowDefinitions>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="100"/>
                         <ColumnDefinition Width="*"/>
                         <ColumnDefinition Width="*"/>
                         <ColumnDefinition Width="*"/>
                     </Grid.ColumnDefinitions>
                     <Image Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" Source="{Binding PreviewImage}" .... />
                     <Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="3" Text="{Binding Title}" ... />
                     <Label Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3" Text="{Binding Address}" ... />     
                     <Label Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" Text="{Binding FoodTypes}" ... />    
                     <!-- Add implementations for Rating, Like-Button and other labels in according rows and columns -->                  
                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Вам также понадобится класс Model для элемента ресторана, который будет содержать все данные, которые я набросал в тегах {Binding XXX}.В своем коде вы должны создать список (или лучше ObservableCollection) и установить его в качестве источника элементов ListView.

Также вам, вероятно, потребуется добавить некоторые эффекты или пользовательские средства визуализации для визуальных обновлений, таких как перетаскивание.тени и т. д.

...