05 事件x 触发x 跨平台方法

作者: 归零者 分类: UI学习 发布时间: 2017-09-06 13:26




学习目标


  • XAML活动
  • 轻敲姿势
  • 跨平台方法实作与使用


    这小节主要延续第八章XAML和C#的配合,介绍XAML事件指派,与设定任何Visual Elements都可以进行的互动事件( GestureRecognizers )。

    Xamarin GestureRecognizers 互动事件目前有三种,触击(Tap)、缩放(Pinch) 和Pan (拖曳)。


    最后讲解第九章,针对不同平台的方法实作,与前面提到的onplatform不一样,

    因为有些”共用”方法还未出现于Xamarin.Forms,所以必须将实作拉到iOS或Android专案内,再回到Portable专案内执行。

    原文书第八章末和第九章其实有实作一个叫做Monkey tap 的小游戏(篇幅满大的),但不会出现在本小节教学,有机会再另一开篇好了…

    这系列的教学着重于方法的介绍。

     


     

    XAML活动

     

    若要在XAML的Visual Elements内写对应C#的事件,最简单的例子可以来看Button Clicked事件:


  1. <StackLayout
    Orientation=“Horizontal”>


  2. <Button
    Text=“Click Me”
    x:Name=“Button_Click”
    Clicked=“Button_Click_Clicked”
    />


  3. </StackLayout>


建立事件时,我通常会交由Visual Studio自己去产生事件方法,

以此处的例子来说,我会先指派x:Name的值,接着利用intellisense的强大… 

标签内按下Clicked=就会出现…


 

按下Enter 后就会藉由x:Name 帮你产生事件名称…


 

再去.cs 看,就会产生对应的方法了…


 

好处就是不用去记得要带入什么参数( object 和EventArgs )。

若有写过Webform 的应该会很熟悉…

 

 

轻敲姿势

 

若你要一个BoxView也拥有点击的事件时该怎办?

 

就要借用GestureRecognizers来处理,每一个Visual Elements都能加入GestureRecognizers,并于GestureRecognizers内指定要做的事件

事件除了Tap (触击)外,还有Pinch (缩放手势)以及Pan (拖曳)  以使用。
详可见  https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/gestures/

 

在BoxView 加入触击事件:

  1. <BoxView
    Color=“Blue”>


  2. <BoxView.GestureRecognizers>


  3. <TapGestureRecognizer
    Tapped=“OnBoxViewTapped”
    />


  4. </BoxView.GestureRecognizers>


  5. </BoxView>


当然要有对应的C# 事件: 


  1. private
    void
    OnBoxViewTapped(object sender, EventArgs e)
  2. {
  3.  
     
  4. }

 


实作跨平台方法

第九章会提到这件事情完全是因为-要让第八章实作的小游戏  Monkey Tap加入声音

但Xamarin.Forms没有提供产生声音的类别库,而各平台产生音效的方法又不一样。

所以我们必须在不同平台内各别去实作,然后在Portable内藉由ASP.NET提供的 Dependency方法来映射并使用。

这边举一个简单的例子,程式功能为显示平台的资讯:

1.起手式-先在Portable专案内定义介面: 

  1. namespace DisplayPlatformInfo

  2. {

  3. public
    interface
    IPlatformInfo

  4. {

  5. string
    GetModel();
  6.  

  7. string
    GetVersion();
  8. }
  9. }


2.接着在不同平台的专案内实作: 
iOS实作: 

  1. using System;
  2. using UIKit;
  3. using Xamarin.Forms;
  4.  
  5. [assembly: Dependency(typeof(DisplayPlatformInfo.iOS.PlatformInfo))]
  6.  
  7. namespace DisplayPlatformInfo.iOS
  8. {

  9. public
    class
    PlatformInfo : IPlatformInfo

  10. {

  11. UIDevice device = new
    UIDevice();
  12.  

  13. public
    string
    GetModel()
  14. {

  15. return device.Model.ToString();
  16. }
  17.  

  18. public
    string
    GetVersion()
  19. {

  20. return
    String.Format(“{0} {1}”, device.SystemName,
  21. device.SystemVersion);
  22. }
  23. }
  24. }


Android 实作: 

  1. using System;
  2. using Android.OS;
  3. using Xamarin.Forms;
  4.  
  5. [assembly: Dependency(typeof(DisplayPlatformInfo.Droid.PlatformInfo))]
  6.  
  7. namespace DisplayPlatformInfo.Droid

  8. {

  9. public
    class
    PlatformInfo : IPlatformInfo

  10. {

  11. public
    string
    GetModel()
  12. {

  13. return
    String.Format(“{0} {1}”, Build.Manufacturer,

  14. Build.Model);
  15. }
  16.  

  17. public
    string
    GetVersion()
  18. {

  19. return
    Build.VERSION.Release.ToString();
  20. }
  21. }
  22. }


3. 最后回到可携式(Portable) 专案内使用: 

  1. namespace DisplayPlatformInfo

  2. {

  3. public
    partial
    class
    DisplayPlatformInfoPage : ContentPage

  4. {

  5. public
    DisplayPlatformInfoPage()
  6. {

  7. InitializeComponent();
  8.  

  9. IPlatformInfo platformInfo = DependencyService.Get<Iplatforminfo>();
  10. modelLabel.Text = platformInfo.GetModel();
  11. versionLabel.Text = platformInfo.GetVersion();
  12. }
  13. }
  14. }

注意 IPlatformInfo platformInfo 藉由 DependencyService.Get() 的宣告用法。


执行结果:


如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

说点什么

avatar
  Subscribe  
提醒
跳至工具栏