【问题标题】:Can't add a new blank page in Xamarin无法在 Xamarin 中添加新的空白页
【发布时间】:2020-07-23 04:41:00
【问题描述】:

我已经构建了 Xamarin 应用程序,但现在我想在开始时添加注册/登录页面。当我打开应用程序时,首先它会打开一个注册页面。

我添加了一个标题为“Welcome to App”的空白页面并添加了一个按钮,但是按钮不起作用,只有在使用其他页面的导航时才起作用,为什么?以及如何在空白页添加注册表单?

IMAGE: It now looks like this.

我想从顶部删除这些凭据、帐户等,然后只有一个空白的注册页面。

这是代码,希望它可以帮助您更好地理解它。如果您需要其他任何东西,请向它索取。

谢谢:)

更新:@Jason Comment:我从 MainPage.xml 中删除了登录代码,现在导航选项卡不再存在,但现在按钮不起作用(当我单击它时,没有任何反应)。强>

LoginPage.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>

LoginPage.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();
        }
    }
}

LoginViewMode.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
        }
    }
}

MainPage.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>

MainViewModel.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
    }
}

【问题讨论】:

  • 如果您不希望在 LoginPage 上显示选项卡,则从选项卡式页面中删除 LoginPage,并在应用启动时分配 MainPage = new LoginPage(); in App.xaml.cs
  • @jason,使用 LoginPage = Osma.Mobile.App.Views.Login.LoginPage;公共应用程序(IContainer 容器){ InitializeComponent(); MainPage = new LoginPage();
  • @Jason,请看一下 App.xml.cs,我已经在其中添加了 LoginPage()!
  • @Jason 我应该从哪些页面删除代码?
  • @Jason,我从 MainPage.xml 中删除了登录代码,现在当应用程序启动时它甚至不显示登录页面,打开凭据页面,为什么?

标签: c# .net xamarin mobile xamarin.forms


【解决方案1】:

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

NavigationService 通常将页面插入到 NaviagtionPage 实例的页面堆栈中。

我在 App.xaml.cs 中看到您将 LoginPage 设为主页,但您在哪里将其切换为 NavigationPage 或 TabbedPage?

您需要检查您的 MainPage 应该是什么。

【讨论】:

  • 在评论部分阅读我与@jason 的对话,“我从 MainPage.xml 中删除了登录代码,现在导航选项卡不再存在但现在按钮不起作用(当我点击它,没有任何反应)。-> i.stack.imgur.com/EAJpw.jpg "
  • 首先它看起来像这样 (i.stack.imgur.com/1uRSU.jpg),但是按钮可以工作。现在看起来像这样(i.stack.imgur.com/EAJpw.jpg),现在按钮不起作用,为什么?
  • 再一次,TabbedPage 和您的 LoginPage 没有继承 NaviagtionPage,因为这些是您的 MainPage,所以我看不到 NavigationService 做了什么。我认为您在某处缺少 NavigationPage 实例以使其全部正常工作。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2023-01-15
相关资源
最近更新 更多