Подключение страниц с вкладками Xamarin Form к XAML

Я новичок во всем этом и в настоящее время пытаюсь получить высоту вкладок в форме страницы с вкладками Xamarin. Единственное решение, которое я нашел для этого, - написать собственный рендерер, и это то, с чем мне трудно.

После пары дней борьбы мне удалось добраться до этого места (надеюсь, на правильном пути), однако я просто не могу понять, как подключить XAML к моей пользовательской странице с вкладками. Это то, что у меня есть до сих пор.

GameTab.xaml

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage 
            xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            x:Class="Diplomacy.Views.GameTab"
            xmlns:pages="clr-namespace:Diplomacy.Views"
            xmlns:custom="clr-namespace:Diplomacy.CustomRenderers">
    <!--Pages can be added as references or inline-->

    <TabbedPage.Children>
        <pages:TabbedMap            Title="Map"         Icon="tank.png"/>
        <pages:TabbedChat           Title="Chat"        Icon="chat.png"/>
    </TabbedPage.Children>
</TabbedPage>

GameTab.xaml.cs

namespace Diplomacy.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class GameTab : Xamarin.Forms.TabbedPage
    {
        SelectionGamesViewModel viewModel;

        public GameTab(SelectionGamesViewModel viewModel)
        {
            InitializeComponent();

            // Disables switching between tabs with the swipe gesture
            On<Xamarin.Forms.PlatformConfiguration.Android>().DisableSwipePaging();

            // Sets the tab at the bottom in android phones
            On<Xamarin.Forms.PlatformConfiguration.Android>().SetToolbarPlacement(ToolbarPlacement.Bottom);

            BindingContext = this.viewModel = viewModel;
        }
    }

MyCustomRenderer.cs

namespace Diplomacy.CustomRenderers
{
    public class CustomTabbedPage : Xamarin.Forms.TabbedPage
    {
    }
}

На данный момент моим следующим шагом будет использование CustomTabbedPage (поправьте меня, если я ошибаюсь).

С помощью этой строки: xmlns:custom="clr-namespace:Diplomacy.CustomRenderers" я должен быть в состоянии вклиниться в форму страницы с вкладками Xamarin с помощью моего пользовательского рендеринга, который в настоящее время ничего не делает.

Я считаю, что это делается путем изменения TabbedPage на CustomTabbedPage, как показано ниже.

<?xml version="1.0" encoding="utf-8" ?>
<custom:CustomTabbedPage 
            xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            x:Class="Diplomacy.Views.GameTab"
            xmlns:pages="clr-namespace:Diplomacy.Views"
            xmlns:custom="clr-namespace:Diplomacy.CustomRenderers">
    <!--Pages can be added as references or inline-->
.
. // Same stuff goes here
.

</custom:CustomTabbedPage>

Однако, когда я это делаю, я получаю всевозможные ошибки в GameTab.xaml.cs и 1 ошибку на странице навигации при попытке нажать GameTab (вторая ошибка)

введите здесь описание изображения

Я боролся, наверное, уже несколько недель, мне действительно нужна помощь в настройке этого пользовательского рендеринга. Я понимаю теорию того, что он делает и какова его цель, однако я не совсем понимаю, как компилятор обрабатывает все это и как связать все это вместе. Пожалуйста и спасибо. Извините за длинный вопрос, просто хотел уточнить.

РЕДАКТИРОВАТЬ: это код пользовательского рендерера Android, который находится в Diplomacy.Android.

[assembly: ExportRenderer(typeof(CustomTabbedPage), typeof(MyTabbedPage))]
namespace Diplomacy.Droid.CustomRenderer
{
    public class MyTabbedPage : TabbedRenderer
    {
        public MyTabbedPage(Context context) : base(context)
        {
        }
    }
}

person Matt    schedule 05.02.2019    source источник
comment
в одном месте вы используете GameTab, в другом CustomTabbedPage   -  person Jason    schedule 05.02.2019
comment
далее, зачем ты это делаешь? Зачем нужно знать высоту вкладки?   -  person Jason    schedule 05.02.2019
comment
Когда я создал эту TabbedPage с именем GameTab, вот так она появилась, и я ее оставил. Он отлично работает без пользовательского рендеринга.   -  person Matt    schedule 05.02.2019
comment
Я хотел найти высоту вкладки, потому что при использовании жеста панорамирования он не позволяет мне перемещаться до нижней части изображения/карты. Я использую Screen.Height, но предполагаю, что он не учитывает вкладки или панель навигации. Кроме того, я хотел бы узнать, как работают пользовательские рендереры, поэтому я подумал, что это простой пример. В конце концов я думаю, что хотел бы изменить высоту вкладки и цвет фона.   -  person Matt    schedule 05.02.2019
comment
Код программной части GameTab должен наследоваться от CustomTabbedPage, об этом говорит первое сообщение об ошибке.   -  person Jason    schedule 05.02.2019
comment
Одна из вещей, которые я пробовал, заключалась в том, чтобы изменить эту строку кода на «общедоступный частичный класс GameTab: CustomTabbedPage», что не дало мне никаких ошибок, однако не заполнило вкладку. Он сделал еще один шаг вперед и заполнил экран вкладкой по умолчанию (вымышленной картой), однако никаких вкладок не было видно. Я думал, что сделал неверный шаг.   -  person Matt    schedule 05.02.2019
comment
у вас действительно есть CustomRenderer? Для каждой платформы, которую вы поддерживаете, будет по одной, и она будет жить в платформенном (не совместно используемом) проекте.   -  person Jason    schedule 05.02.2019
comment
Я делаю для Android, я просто разместил код внизу. У меня нет ничего для iOS, но я тоже не могу эмулировать его (нет Mac), хотя у моего друга есть, мы оба новички в этом.   -  person Matt    schedule 05.02.2019
comment
если код собирается и запускается, но пользовательский интерфейс неправильный, то проблема, вероятно, в рендерере   -  person Jason    schedule 05.02.2019


Ответы (1)


Все ошибки, которые вы получаете, возникают только по одной причине: другая часть вашего частичного класса, т. е. файлы GameTab.xaml.cs, класс GameTab наследуется не от вашего CustomTabbedPage, а от вашего Xamarin.Forms.TabbedPage.

Все, что вам нужно сделать, это что-то вроде этого в вашем GameTab.xaml.cs

   public partial class GameTab : Diplomacy.CustomRenderers.CustomTabbedPage
person FreakyAli    schedule 05.02.2019
comment
Я только что попробовал это, и он делает то же самое, что и «Общедоступный частичный класс GameTab: CustomTabbedPage», он не помещает вкладки на экран, однако он помещает содержимое вкладки по умолчанию, вымышленную карту, но без вкладок. . У меня есть панель навигации вверху. - person Matt; 05.02.2019
comment
Я думаю, что в вашем коде отсутствуют важные свойства страницы с вкладками при использовании нижнего выравнивания вкладок, проверьте этот блог Джеймса Монтеманьо montemagno.com/ - person FreakyAli; 05.02.2019
comment
Это веб-сайт, с которого я получил эту строку кода, однако я не совсем уверен, чего в ней не хватает, у меня есть использование и 1 строка кода. Я только что прокомментировал эти две строки, DisableSwipe и SetToolbarPlacement, и вкладка все еще не отображается. - person Matt; 05.02.2019
comment
Добавьте их и посмотрите, что произойдет BarBackgroundColor="#2196F3" BarTextColor="White" - person FreakyAli; 05.02.2019
comment
Я предположил, что вы хотели, чтобы я добавил это в ‹custom:CustomTabbedPage›? Я так и сделал и ничего. Места для вкладки даже нет. Изображение занимает все пространство экрана (кроме панели навигации). - person Matt; 05.02.2019
comment
Какую версию xf вы используете? Также причина, по которой это происходит, заключается в том, что ваш нижний навигационный вид со стороны Android не имеет фиксированной высоты. - person FreakyAli; 05.02.2019
comment
Иксмарин — 4.12.3.78 - person Matt; 06.02.2019
comment
Как придать ему фиксированную высоту? - person Matt; 06.02.2019
comment
Xamarin - 4.12.3.78- Я имею в виду брата Xamarin.Forms, а не версию Xamarin - person FreakyAli; 06.02.2019
comment
How do I give it a fixed height?- В вашем пользовательском рендерере - person FreakyAli; 06.02.2019