c#开发移动APP-Xamarin入门剖析

简介: 原文:c#开发移动APP-Xamarin入门剖析  剖析应用程序     Phoneword这个项目是.net标准库项目,它包含所有的共享代码和共享UI。   Phoneword.Android这个项目包含Android特定的代码,是Android应用程序的入口点。
原文: c#开发移动APP-Xamarin入门剖析

  剖析应用程序

 

  Phoneword这个项目是.net标准库项目,它包含所有的共享代码和共享UI

  Phoneword.Android这个项目包含Android特定的代码,是Android应用程序的入口点。

  Phoneword.iOS -这个项目包含iOS特定的代码,是iOS应用程序的入口点。

  Phoneword.UWP -这个项目包含通用Windows平台(UWP)特定的代码,是UWP应用程序的入口点

 

  下面的截图显示了Visual StudioPhoneword .NET标准库项目的内容:

 

  App. XAML——App类的XAML标记,它为应用程序定义了一个资源字典。

  App.xaml.cs——应用App类的后台代码,它负责实例化应用程序在每个平台上显示的第一个页面,以及处理应用程序生命周期事件。

  IDialer.cs—— IDialer接口 指定拨号方法必须由任何实现类提供

  MainPage.xaml——MainPage类的xaml标记,它为应用程序启动时显示的页面定义UI

  MainPage.xaml.cs——MainPage类的后台代码,它包含用户与页面交互时执行的业务逻辑。

  PhoneTranslator.cs -负责转换电话号码,被MainPage.xaml.cs调用。

 

  Xamarin.Form应用程序的架构方式与传统的跨平台应用程序相同。共享代码通常放在.net标准库中,特定于平台的应用程序使用共享代码。下图显示了Phoneword应用程序的这种关系的概述:

 

 

  为了最大限度地重用启动代码,Xamarin.Form应用程序有一个名为App单独的类,它负责实例化应用程序在每个平台上显示的第一个页面,如下面的代码示例所示:

 1 using Xamarin.Forms;
 2 using Xamarin.Forms.Xaml;
 3 [assembly: XamlCompilation(XamlCompilationOptions.Compile)]
 4 namespace Phoneword
 5 {
 6     public partial class App : Application
 7     {
 8         public App()
 9         {
10             InitializeComponent();
11             MainPage = new MainPage();
12         }
13         ...
14     }
15 }
View Code

 

  这段代码将App类的MainPage 属性设置为MainPage 类的新实例。此外,XamlCompilation属性会打开XAML编译器,从而将XAML直接编译为中间语言。更多信息查看 XAML Compilation.

 

在每个平台上启动应用程序

iOS

  ios上为了运行首页,iOS项目包含从FormsApplicationDelegate类继承而来的AppDelegate类,如下面的代码示例所示

 

namespace Phoneword.iOS
{
    [Register ("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init ();
            LoadApplication (new App ());
            return base.FinishedLaunching (app, options);
        }
    }
}

  FinishedLaunching通过调用Init方法重写Xamarin.Forms框架的初始化,这将导致Xamarin.Forms 在IOS平台的实现在通过调用LoadApplication方法设置根视图控制器之前加载

 

Android

  在Android上为了运行首页,Phoneword.Droid项目包含使用MainLauncher属性创建Activity的代码,该activity 继承自FormsAppCompatActivity类,如下面的代码示例所示

namespace Phoneword.Droid
{
    [Activity(Label = "Phoneword", 
              Icon = "@mipmap/icon", 
              Theme = "@style/MainTheme", 
              MainLauncher = true,
              ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        internal static MainActivity Instance { get; private set; }

        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);
            Instance = this;
            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
        }
    }
}

  OnCreate通过调用Init方法重写初始化Xamarin.Form框架,这将导致安卓特定平台的Xamarin.Forms的实现被加载在Xamarin.Forms 程序加载前。此外,MainActivity类在Instance属性中存储对自身的引用。Instance属性称为本地上下文,并被PhoneDialer类引用。

 

UWP

  初始化Xamarin.Form框架的Init方法在App类被调用:

Xamarin.Forms.Forms.Init (e);
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
  ...
}

  Xamarin.Forms首页在MainPage类中被启动

namespace Phoneword.UWP
{
    public sealed partial class MainPage
    {
        public MainPage()
        {
            this.InitializeComponent();
            this.LoadApplication(new Phoneword.App());
        }
    }
}

  通过LoadApplication方法Xamarin.Forms 程序被加载

 

用户界面

  有四个主要的用于创建Xamarin.Forms 应用程序的用户界面的控件组。

  Pages -Xamarin.Forms页面表示跨平台的移动应用程序屏幕。Phoneword应用程序使用ContentPage类显示单个屏幕。

 

  Layouts-Xamarin.Forms布局是用来将视图组合成逻辑结构的容器。Phoneword应用程序使用StackLayout类在水平堆栈中排列控件。

 

  Views-Xamarin.Forms视图是显示在用户界面上的控件,例如标签、按钮和文本输入框。Phoneword应用程序使用标签、条目和按钮控件。

 

  Cells-Xamarin.Forms单元格是用于列表中的项的特殊元素,并描述如何绘制列表中的每个项

 

  当Phoneword应用程序在任何平台上运行时,它会显示一个对应于Xamarin.Forms页面的屏幕。页面对应Android中的ViewGroupiOS中的视图控制器或通用Windows平台上的页面。Phoneword应用程序还实例化了一个表示MainPage类的ContentPage对象,其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"
                         x:Class="Phoneword.MainPage">
        ...
        <StackLayout>
            <Label Text="Enter a Phoneword:" />
            <Entry x:Name="phoneNumberText" Text="1-855-XAMARIN" />
            <Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />
            <Button x:Name="callButton" Text="Call" IsEnabled="false" Clicked="OnCall" />
        </StackLayout>
</ContentPage>

  下面的代码示例显示了MainPage类的隐藏代码中的OnTranslate方法,该方法在Translate按钮上触发单击事件时会执行。

void OnTranslate(object sender, EventArgs e)
{
    translatedNumber = Core.PhonewordTranslator.ToNumber (phoneNumberText.Text);
    if (!string.IsNullOrWhiteSpace (translatedNumber)) {
        callButton.IsEnabled = true;
        callButton.Text = "Call " + translatedNumber;
    } else {
        callButton.IsEnabled = false;
        callButton.Text = "Call";
    }
}

  XAML类的代码隐藏文件可以访问XAML中定义的对象,通过使用 x:Name属性赋给它的名称

 

Phoneword中引入的其他概念

  1-显示警告对话框

await this.DisplayAlert (
        "Dial a Number",
        "Would you like to call " + translatedNumber + "?",
        "Yes",
        "No");

  2-通过DependencyService类访问本机特性

Phoneword 使用DependencyService类解析特定平台对IDialer接口接口的实现

async void OnCall (object sender, EventArgs e)
{
    ...
    var dialer = DependencyService.Get<IDialer> ();
    ...
}

  3-使用URL拨打电话

Phoneword应用程序使用OpenURL启动系统电话应用程序。URLtel:前缀和要调用的电话号码组成,如下iOS项目代码示例所示:

 

return UIApplication.SharedApplication.OpenUrl (new NSUrl ("tel:" + number));

 

  4-调整平台布局

  Device类允许开发人员在每个平台上定制应用程序布局和功能,如下面的代码示例所示,它在不同平台上使用不同padding值来正确显示每个页面

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" ... >
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness">
            <On Platform="iOS" Value="20, 40, 20, 20" />
            <On Platform="Android, UWP" Value="20" />
        </OnPlatform>
    </ContentPage.Padding>
    ...
</ContentPage>

 

目录
相关文章
|
1月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
142 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
2月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
208 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
1月前
|
安全 API Swift
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
108 15
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
|
25天前
|
Web App开发 编解码 算法
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
在当今移动社交领域,一对一视频和语音通话功能已成为用户期待的基础配置。从熟人社交到陌生人交友,从专业咨询到情感陪伴,实时音视频互动能力直接决定了社交App的用户留存和市场竞争力。山东布谷科技将深入探讨一对一直播源码开发高质量一对一视频和语音通话功能的关键要素和技术实现方案。
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
|
18天前
|
人工智能 小程序 API
【一步步开发AI运动APP】四、使用相机组件抽帧
本文介绍了如何使用`ai-camera`组件开发AI运动APP,助力开发者深耕AI运动领域。`ai-camera`是专为AI运动场景设计的相机组件,支持多平台,提供更强的抽帧处理能力和API。文章详细讲解了获取相机上下文、执行抽帧操作以及将帧保存到相册的功能实现,并附有代码示例。无论是AI运动APP还是其他场景,该组件都能满足预览、拍照、抽帧等需求。下篇将聚焦人体识别检测,敬请期待!
|
11天前
|
人工智能 开发框架 小程序
工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐
为庆祝中华全国总工会成立100周年,特推出基于AI技术的智能健身系统,以小程序和APP形式呈现,助力职工健康生活。方案包括:1) 小程序插件,支持多种运动识别,开箱即用;2) APP插件,提供更高精度的运动检测;3) 成熟的「AI乐运动」系统,支持赛事活动管理。这些方案满足不同需求,推动全民健身体验升级,彰显工会对职工健康的关怀。
|
14天前
|
人工智能 小程序 开发者
【一步步开发AI运动APP】六、运动计时计数能调用
本文章介绍了如何通过【一步步开发AI运动APP】系列博文,利用uniAPP插件开发高性能的AI运动应用。文中详细说明了创建运动分析器、进行运动分析、监听计数变化以及停止/重置分析等功能实现步骤。插件内置多种常见运动(如跳绳、俯卧撑等),支持自定义扩展,满足健身、体测等场景需求。示例代码展示了人体检测、运动计时计数及UI更新的完整流程,帮助开发者快速上手并深耕AI运动领域。
|
10天前
|
缓存 开发工具 开发者
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
|
18天前
|
人工智能 小程序 API
【一步步开发AI运动APP】五、人体检测能力调用
本文介绍如何开发性能更强、体验更优的AI运动APP,涵盖人体检测、实例创建、检测识别、骨骼图绘制及完整代码实现。通过API `createHumanDetector`,可灵活配置高性能、高精度或多人检测模式,省去模型部署麻烦。检测结果可通过`yz-pose-grapher`组件高效渲染骨骼图。最后提醒使用完毕需调用`destroy()`释放资源,下篇将聚焦运动检测分析,敬请期待!
|
19天前
|
人工智能 开发框架 小程序
【一步步开发AI运动APP】二、跨平台APP AI运动识别方案介绍
本系列博文旨在帮助开发者从【AI运动小程序】迈向性能更优的【AI运动APP】开发。通过「云智AI运动识别」uni-app版插件,提供本地原生极速识别、精准姿态检测及运动计时计数功能,支持健身系统、线上赛事、学生体测、康复锻炼等多场景应用。插件无需云端依赖,一次付费永久使用,成本低且扩展性强。同时兼容uni-app与uni-app x框架,适合不同技术背景的开发者快速上手,助力抢占AI辅助运动市场。下篇将介绍插件引入,敬请期待!

热门文章

最新文章