Как добавить значок на панель навигации на всех страницах? - PullRequest
0 голосов
/ 13 февраля 2019

Итак, я пытаюсь реализовать иконку в моем NavigationBar, чтобы она была видна на всех моих страницах ... Я использую формы xamarin, поэтому хочу, чтобы она работала как в Android, так и в IOS ... Яя не уверен, как это сделать, но я пытался добавить это в моем MyCar.xaml

<customControls:BasePage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
    xmlns:views="clr-namespace:OficinaDigitalX.Views"   
    xmlns:customControls="clr-namespace:OficinaDigitalX.ViewModel"
    x:Name="MyCar">
<customControls:BasePage.Content>
    <AbsoluteLayout>



        <StackLayout Padding="10, 0, 10, 0">


            <ListView 
                ItemsSource="{Binding Path=CarList}"
                IsPullToRefreshEnabled="False"
                SelectedItem="{Binding Path=SelectedCar}">
                <ListView.Header>
                    <Label Text="Os Meus Carros" FontSize="Large" />
                </ListView.Header>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextCell Text="{Binding VID}" 
                                  TextColor="Black" 
                                  Detail="{Binding LicensePlate}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    </AbsoluteLayout>
</customControls:BasePage.Content>
</customControls:BasePage>  

Это мой MyCar.xaml.cs

namespace OficinaDigitalX.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyCar : ViewModel.BasePage
{

    public MyCar()
    {
        Extensions.LoadFromXaml(this, typeof(MyCar));
        BindingContext = new MyCarViewModel(Navigation);

    }

это мойMyCarViewModel.cs

public class MyCarViewModel : ViewModelBase
{
    public MyCarViewModel()
    {
    }
    public MyCarViewModel(INavigation navigation)
    {
        this.Navigation = navigation;
        this.SelectedCar = null;
        GetClientCars();
    }

    private List<CarInfo> _CarList;

    public List<CarInfo> CarList
    {
        get
        {
            return _CarList;
        }

        set
        {
            _CarList = value;
            OnPropertyChanged("CarList");
        }
    }

    private CarInfo _SelectedCar;

    public CarInfo SelectedCar
    {
        get
        {
            return _SelectedCar;
        }

        set
        {
            _SelectedCar = value;
            OnPropertyChanged("SelectedCar");

            if (_SelectedCar != null)
                ChangeWindow(_SelectedCar);
        }
    }

    public INavigation Navigation { get; set; }

    private void ChangeWindow(CarInfo car)
    {

        Navigation.PushAsync(new Interactions(car));
        this.SelectedCar = null;

    }

    public void GetClientCars()
    {
        string command = "asdasd";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(MainPage.server + command));
        request.ContentType = "application/json";
        request.Method = "POST";
        //request.ContentLength = 999999;

        using (var stream = new StreamWriter(request.GetRequestStream()))
        {
            string postData = JsonConvert.SerializeObject(command);

            //stream.Write(postData);
            stream.Flush();
            stream.Close();
        }

        HttpWebResponse response = null;

        try
        {
            response = (HttpWebResponse)request.GetResponse();
            using (var responseString = new StreamReader(response.GetResponseStream()))
            {
                CarList = JsonConvert.DeserializeObject<List<CarInfo>>(responseString.ReadToEnd());
            }
        }
        catch (WebException ex)
        {
            using (StreamReader reader = new StreamReader(ex.Response.GetResponseStream()))
            {

            }
            throw;
        }
    }

}
}

Может кто-нибудь помочь с этим?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Правильный способ сделать это в моих Знаниях - это расширить страницу контента:

 public class BasePage : ContentPage
 {

    public ICommand CartItemCommand { get; set; }
    public ICommand NotificationPageCommand { get; set; }
    public BasePage() : base()
    {
        CartItemCommand = new Command(async () => await GoCartItemCommand());
        NotificationPageCommand = new Command(GoNotificationPage);

        Init();
    }

    private void Init()
    {
        this.ToolbarItems.Add(new ToolbarItem()
        {
            Icon = "nav_notification_btn",
            Command = NotificationPageCommand,
        });
        this.ToolbarItems.Add(new ToolbarItem()
        {
            Icon = "nav_cart_btn",
            Command = CartItemCommand
        });
    }

    }

}

И как только вы закончите с этим, просто используйте эту BasePage везде вместо PlacePage

В вашем XAML

<customControls:Basepage xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
        xmlns:views="clr-namespace:OficinaDigitalX.Views"
        x:Class="OficinaDigitalX.MainPage"    
        xmlns:customControls="Your Control NameSpace"
        x:Name="Main"
        NavigationPage.HasNavigationBar="True">


</customControls:Basepage> 

И в вашем файле Xaml.cs

public partial class MainPage: BasePage

Следите за тем, чтобы оба частичных класса наследовали от одной базовойclass т.е. BasePage или ContentPage в соответствии с вашими потребностями.

А когда вы не хотите использовать элементы управления NavBar, просто наследуйте ваши классы XAML от Normal ContentPage.

Goodluck возвращаются в случае запросов!

0 голосов
/ 13 февраля 2019

У вас есть два способа реализовать это:

1- NavigationPage.TitleView , в который вы можете поместить свой значок с тегом Image.

2- Использованиепользовательский элемент управления с именем NavBarView и использовать его на своих страницах внутри атрибута ControlTemplate.Реализация NavBarView может быть такой:

<?xml version="1.0" encoding="UTF-8" ?>
<ControlTemplate
    x:Class="YourAppName.View.Controls.NavBarView"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="46" />
            <RowDefinition Height="1" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackLayout
            Padding="10,5"
            x:DataType="vm:XeposBaseViewModel"
            BackgroundColor="{StaticResource XeposHeaderBackgroundColor}"
            BindingContext="{TemplateBinding BindingContext}"
            Orientation="Horizontal">
            <!--  YOUR NAVBAR CONTENT HERE -->
        </StackLayout>
        <BoxView Grid.Row="1" BackgroundColor="Black" />
        <ContentPresenter Grid.Row="2" />
    </Grid>
</ControlTemplate>

И использование должно быть таким:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="YourAppName.View.Sell.SomeView"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:controls="clr-namespace:YourAppName.View.Controls;assembly=YourAppName.View"
    ControlTemplate="{StaticResource NavBar}">
    <!--  Your other page data is here  -->
</ContentPage>

NavBar определяется в App.xaml следующим образом, так что вы можете использоватьэто с StaticResource :

<controls:NavBarView x:Key="NavBar" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...