簡體   English   中英

無法在 Xamarin 中添加新的空白頁

[英]Can't add a new blank page in Xamarin

我已經構建了 Xamarin 應用程序,但現在我想在開始時添加注冊/登錄頁面。 當我打開應用程序時,首先它會打開一個注冊頁面。

我添加了一個標題為“Welcome to App”的空白頁面並添加了一個按鈕,但是按鈕不起作用,只有在使用其他頁面的導航時才起作用,為什么? 以及如何在空白頁上添加注冊表單?

圖片:現在看起來像這樣。

我想從頂部刪除這些憑據,Accounts etc,並且只有一個空白頁面的注冊。

這是代碼,希望它可以幫助您更好地理解它。 如果您需要其他任何東西,請向它索取。

謝謝:)

更新: @Jason 評論:我從 MainPage.xml 中刪除了登錄代碼,現在導航選項卡不再存在,但現在按鈕不起作用(當我單擊它時,沒有任何反應)。

在此處輸入圖像描述

登錄頁面.xml

<?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:converters="clr-namespace:Osma.Mobile.App.Converters;assembly=Osma.Mobile.App"
    xmlns:behaviours="clr-namespace:Osma.Mobile.App.Behaviors;assembly=Osma.Mobile.App"
    xmlns:components="clr-namespace:Osma.Mobile.App.Views.Components;assembly=Osma.Mobile.App"
    x:Class="Osma.Mobile.App.Views.Login.LoginPage"
    Title="Login"
    xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
    ios:Page.LargeTitleDisplay="Always"
>
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Welcome to App"
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand" />
            <Button Text="Enter"
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand"
                Command="{Binding ButtonClickedCommand}"
                />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

登錄頁面.xml.cs

using System;
using System.Collections.Generic;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Osma.Mobile.App.Views.Login
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class LoginPage : ContentPage
    {
        public LoginPage()
        {
            InitializeComponent();
        }
    }
}

登錄視圖模式.cs

using System;
using System.Reactive.Linq;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
using System.Threading.Tasks;
using Acr.UserDialogs;
using Hyperledger.Aries.Contracts;
using Hyperledger.Aries.Features.DidExchange;
using Hyperledger.Aries.Utils;
using Osma.Mobile.App.Events;
using Osma.Mobile.App.Extensions;
using Osma.Mobile.App.Services;
using Osma.Mobile.App.Services.Interfaces;
using ReactiveUI;
using Xamarin.Forms;
using Xamarin.Essentials;
using Osma.Mobile.App.ViewModels.Credentials;

namespace Osma.Mobile.App.ViewModels.Login
{
    public class LoginViewModel : ABaseViewModel
    {
        private readonly ICustomAgentContextProvider _agentContextProvider;
        private readonly IConnectionService _connectionService;

        public LoginViewModel(
            IUserDialogs userDialogs,
            INavigationService navigationService,
            ICustomAgentContextProvider agentContextProvider,
            IConnectionService defaultConnectionService) :
            base("Login", userDialogs, navigationService)
        {
            _agentContextProvider = agentContextProvider;
            _connectionService = defaultConnectionService;
        }

        public ICommand ButtonClickedCommand => new Command(async () => await NavigationService.NavigateToAsync<CredentialsViewModel>());
    }
}

App.xaml.css

using System.Threading.Tasks;
using Autofac;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
using Microsoft.AppCenter.Crashes;
using Osma.Mobile.App.Services.Interfaces;
using Osma.Mobile.App.Utilities;
using Osma.Mobile.App.ViewModels;
using Osma.Mobile.App.ViewModels.Login;
using Osma.Mobile.App.ViewModels.Account;
using Osma.Mobile.App.ViewModels.Connections;
using Osma.Mobile.App.ViewModels.CreateInvitation;
using Osma.Mobile.App.ViewModels.Credentials;
using Osma.Mobile.App.Views;
using Osma.Mobile.App.Views.Login;
using Osma.Mobile.App.Views.Account;
using Osma.Mobile.App.Views.Connections;
using Osma.Mobile.App.Views.CreateInvitation;
using Osma.Mobile.App.Views.Credentials;
using Xamarin.Forms;
using Xamarin.Forms.Internals;
using Xamarin.Forms.Xaml;
using LoginPage = Osma.Mobile.App.Views.Login.LoginPage;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace Osma.Mobile.App
{
    public partial class App : Application
    {
        public new static App Current => Application.Current as App;
        public Palette Colors;

        private readonly INavigationService _navigationService;
        private readonly ICustomAgentContextProvider _contextProvider;

        public App(IContainer container)
        {
            InitializeComponent();

            MainPage = new LoginPage();

            Colors.Init();
            _navigationService = container.Resolve<INavigationService>();
            _contextProvider = container.Resolve<ICustomAgentContextProvider>();

            InitializeTask = Initialize();
        }

        Task InitializeTask;
        private async Task Initialize()
        {
            //Pages
            _navigationService.AddPageViewModelBinding<MainViewModel, MainPage>();
            _navigationService.AddPageViewModelBinding<LoginViewModel, LoginPage>();
            _navigationService.AddPageViewModelBinding<ConnectionsViewModel, ConnectionsPage>();
            _navigationService.AddPageViewModelBinding<ConnectionViewModel, ConnectionPage>();
            _navigationService.AddPageViewModelBinding<RegisterViewModel, RegisterPage>();
            _navigationService.AddPageViewModelBinding<AcceptInviteViewModel, AcceptInvitePage>();
            _navigationService.AddPageViewModelBinding<CredentialsViewModel, CredentialsPage>();
            _navigationService.AddPageViewModelBinding<CredentialViewModel, CredentialPage>();
            _navigationService.AddPageViewModelBinding<AccountViewModel, AccountPage>();
            _navigationService.AddPageViewModelBinding<CreateInvitationViewModel, CreateInvitationPage>();

            if (_contextProvider.AgentExists())
            {
                await _navigationService.NavigateToAsync<LoginViewModel>();
            }
            else
            {
                await _navigationService.NavigateToAsync<LoginViewModel>();
            }
        }

        protected override void OnStart()
        {
            #if !DEBUG 
                AppCenter.Start("ios=" + AppConstant.IosAnalyticsKey + ";" +
                                "android=" + AppConstant.AndroidAnalyticsKey + ";",
                        typeof(Analytics), typeof(Crashes));
            #endif
        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
        }
    }
}

主頁.xml

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:connections="clr-namespace:Osma.Mobile.App.Views.Connections;assembly=Osma.Mobile.App"
    xmlns:credentials="clr-namespace:Osma.Mobile.App.Views.Credentials;assembly=Osma.Mobile.App"
    xmlns:account="clr-namespace:Osma.Mobile.App.Views.Account;assembly=Osma.Mobile.App"
    xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
    x:Class="Osma.Mobile.App.Views.MainPage"
    CurrentPageChanged="CurrentPageChanged"
    Appearing="Appearing"
>
    <connections:ConnectionsPage
        Icon="connection_icon.png"
        ios:NavigationPage.PrefersLargeTitles="true"
        BindingContext="{Binding Connections}">
    </connections:ConnectionsPage>
    <credentials:CredentialsPage
        Icon="credentials_icon.png"
        ios:NavigationPage.PrefersLargeTitles="true"
        BindingContext="{Binding Credentials}">
    </credentials:CredentialsPage>
    <account:AccountPage
        Icon="account_icon.png"
        ios:NavigationPage.PrefersLargeTitles="true"
        BindingContext="{Binding Account}">
    </account:AccountPage>
</TabbedPage>

主視圖模型.cs

using System.Threading.Tasks;
using Acr.UserDialogs;
using Osma.Mobile.App.Services.Interfaces;
using Osma.Mobile.App.ViewModels.Login;
using Osma.Mobile.App.ViewModels.Account;
using Osma.Mobile.App.ViewModels.Connections;
using Osma.Mobile.App.ViewModels.CreateInvitation;
using Osma.Mobile.App.ViewModels.Credentials;
using ReactiveUI;

namespace Osma.Mobile.App.ViewModels
{
    public class MainViewModel : ABaseViewModel
    {
        public MainViewModel(
            IUserDialogs userDialogs,
            INavigationService navigationService,
            LoginViewModel loginViewModel,
            ConnectionsViewModel connectionsViewModel,
            CredentialsViewModel credentialsViewModel,
            AccountViewModel accountViewModel,
            CreateInvitationViewModel createInvitationViewModel)
            : base(
                nameof(MainViewModel),
                userDialogs,
                navigationService
        )
        {
            Login = loginViewModel;
            Connections = connectionsViewModel;
            Credentials = credentialsViewModel;
            Account = accountViewModel;
            CreateInvitation = createInvitationViewModel;
        }

        public override async Task InitializeAsync(object navigationData)
        {
            await Login.InitializeAsync(null);
            await Connections.InitializeAsync(null);
            await Credentials.InitializeAsync(null);
            await Account.InitializeAsync(null);
            await CreateInvitation.InitializeAsync(null);
            await base.InitializeAsync(navigationData);
        }

        #region Bindable Properties
        private LoginViewModel _login;
        public LoginViewModel Login
        {
            get => _login;
            set => this.RaiseAndSetIfChanged(ref _login, value);
        }

        private ConnectionsViewModel _connections;
        public ConnectionsViewModel Connections
        {
            get => _connections;
            set => this.RaiseAndSetIfChanged(ref _connections, value);
        }

        private CredentialsViewModel _credentials;
        public CredentialsViewModel Credentials
        {
            get => _credentials;
            set => this.RaiseAndSetIfChanged(ref _credentials, value);
        }

        private AccountViewModel _account;
        public AccountViewModel Account
        {
            get => _account;
            set => this.RaiseAndSetIfChanged(ref _account, value);
        }

        private CreateInvitationViewModel _createInvitation;
        public CreateInvitationViewModel CreateInvitation
        {
            get => _createInvitation;
            set => this.RaiseAndSetIfChanged(ref _createInvitation, value);
        }
        #endregion
    }
}

我沒有看到您在任何地方都有 NavigationPage 實例,那么您的 NavigationService 是如何工作的?

NavigationService 通常將頁面插入到 NaviagtionPage 實例上的頁面堆棧中。

我在 App.xaml.cs 中看到您將 LoginPage 設置為您的主頁,但是您在哪里將其切換到 NavigationPage 或 TabbedPage?

您需要檢查您的 MainPage 應該是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM