Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NativeアプリをXamarin.Formsに移植してみた話

 NativeアプリをXamarin.Formsに移植してみた話

2016年5月7日にJapan Xamarin User Group Conference #13でお話ししたスライドです。

Masaaki Yoshida

May 07, 2016
Tweet

Other Decks in Technology

Transcript

  1. All Rights Reserved. Copyright © CRESCO LTD. 2 ࣗݾ঺հ ٢ాক໌ʢΑͩ͠

    ·͖͋͞ʣ ܦྺ ࢈ۀܥSE→޿ࠂ୅ཧళ Ӧۀˠݱࡏ .NETɺC#͹͔ͬΓ΍ͬͯͨࢲɻ͍͖ͳΓεϚϗܥͷ෦ॺʹɻ →ϠόΠɺ͓ݺͼͰͳ͍ɻɻɻ Xamarinͷग़ձ͍ ͦΜͳதɺ2014/5/29,30ʹߦΘΕͨde:codeʹࢀՃ →౰࣌XamarinΤόͩͬͨ౉ล༑ଠ͞ΜͷxamarinηογϣϯΛௌߨ →C#ͰεϚϗ࡞ΕΔΜͩʂʂ͔͠΋ΫϩεϓϥοτϑΥʔϜɻ →ࣾ಺Ͱܒ໤׆ಈΛ։࢝ →൒೥΄Ͳࣾ಺ษڧձ΍ΠϕϯτͰܒ໤׆ಈΛͨ݁͠Ռɻɻɻ
  2. All Rights Reserved. Copyright © CRESCO, LTD. 4 ʮΈΜͳͷͯΜ͜ʯͷ͘͠Έ αʔόʔ

    18 ɹ/20 50 45 ৘ใরձʗ࿈བྷࢦࣔ Bluetooth πΞʔࢀՃऀ৘ใऔಘ Ի੠௨஌ SMS σʔλೖྗ πΞʔࢀՃऀ ఴ৐һ Ϗʔίϯόοδ ఺ݺઐ༻ iPadΞϓϦ πΞʔ؅ཧऀ
  3. All Rights Reserved. Copyright © CRESCO LTD. 7 ࠓ೔ͷຊ୊ ͢Ͱʹ͋ΔiOSɺAndroidωΟςΟϒͰ

    ࡞ΒΕͨΞϓϦΛXamarin.FormsʹҠ২ ͢Δ࣮ͬͯࡍͷͱ͜ΖɺͲ͏ͳͷʁ
  4. All Rights Reserved. Copyright © CRESCO LTD. 9 ௞ି෺݅ݕࡧΞϓϦͷXamarin.FormsԽ ը໘ߏ੒

    ɾτοϓϖʔδ ɾࢢொଜҰཡϖʔδ ɾ෺݅Ұཡϖʔδ ɾ෺݅ৄࡉϖʔδ ɾMAPϖʔδ
  5. All Rights Reserved. Copyright © CRESCO LTD. 10 τοϓϖʔδ iOS൛ͱAndroid൛ͰUI࢓༷͕ҟͳΔɻ

    ᶃϝχϡʔ ɹiOSɿλϒόʔίϯτϩʔϧͰը໘Լ෦ʹɻ ɹAndroidɿϋϯόʔΨʔϝχϡʔͰը໘্෦ʹɻ ᶄ஫هจݴ ɹiOSɿ͋Γ ɹAndroidɿͳ͠ ᶃ ᶃ ᶄ Google͞Μ͸ϋϯόʔΨʔϝχϡʔ͕ େ޷͖ͰɺApple͞Μ͸৹͕ࠪݫ͘͠ ಠࣗରԠ͕ඞཁͳΜͯ͜ͱ΋ Α͋͘Δ͓࿩ ͊͞Ͳ͏͠Α͏ɻ
  6. All Rights Reserved. Copyright © CRESCO LTD. 11 τοϓϖʔδ<ϝχϡʔ> Xamarin.Formsͷඪ४ίϯτϩʔϧʹ͸TabbedPage͕͋Δ

    iOS͸͍͍ײ͡ ϋϯόʔΨʔϝχϡʔɾɾɾ Xamarin.Formsඪ४ίϯτϩʔϧͰ ࢓༷Λຬͨͤͳ͍৔߹ɺ࣮૷ෆՄೳʁ ͦΜͳ͜ͱ͸͋Γ·ͤΜɻ ϓϥοτϑΥʔϜ͝ͱʹ ݸผUIΛ࣮ݱ͢Δํ๏ͱͯ͠ɺ Custom Renderer͕༻ҙ͞Ε͍ͯ·͢ɻ
  7. All Rights Reserved. Copyright © CRESCO LTD. 12 τοϓϖʔδ<Custom Rendererͷ࣮૷ྫ>

    <ContentPage.Content>
 ɹɹ<StackLayout Spacing="0" Padding="0" BackgroundColor="#EEEEEE"> ɹɹɹɹ<ContentView VerticalOptions="Start" >
 ɹɹɹ<local:HamburgerMenuView />
 ɹ</ContentView>
 ɹ<ContentView VerticalOptions="FillAndExpand" >
 ɹɹɹɹɹɹ<local:TopScrollView x:Name="MyScrollView" />
 ɹ</ContentView>
 ɹ<ContentView VerticalOptions="End" >
 ɹɹ<local:GlobalMenuView />
 ɹɹɹɹ</ContentView>
 ɹɹ</StackLayout>
 </ContentPage.Content> ᶃPCLଆͰViewΛఆٛ(TopPage.Xaml) ᶄViewΛ3ͭͷཁૉʹ෼ׂ ɹ1.HambugerMenuView ɹ2.TopScrollView ɹ3.GlobalMenuView ᶅiOS Custom RedererͰHambugerMenuViewΛඇදࣔʹ ᶆAndroid Custom RendererͰGlobalMenuViewΛඇදࣔʹ TopPage.Xaml
  8. All Rights Reserved. Copyright © CRESCO LTD. 13 τοϓϖʔδ<Custom Rendererͷ࣮૷ྫ>

    [assembly:ExportRenderer (typeof(HamburgerMenuView), typeof(HamburgerMenuView_iOS))]
 namespace HogeHoge.iOS
 {
 public class HamburgerMenuView_iOS : ViewRenderer<ContentView, UIView>
 {
 public HamburgerMenuView_iOS ()
 {
 }
 /**
 * Delete Hamburger Menu
 */ 
 protected override void OnElementChanged (ElementChangedEventArgs<ContentView> e){
 base.OnElementChanged (e);
 
 if (e.OldElement != null || Element == null) {
 return;
 }
 e.NewElement.Content = null;
 }
 }
 } iOSϨϯμϦϯάΫϥεͰɺassembly:ExportRendererఆٛͰForms HamburgerMenuViewΫϥεϨϯμϦϯάޙɺiOS HamburgerMenuView_iOSΫϥεΛϨϯμϦϯά͢ΔΑ͏ʹઃఆ͠·͢ɻ OnElementChangedͰ͸e.NewElement ͕ Forms ContentView ʹͳΓ·͢ɻ͜ͷContentʹnullΛ୅ೖ͢Δͱɺ಺แ͢ΔΠϝʔδ ͕ফڈ͞Ε·͢ɻ Forms ϨΠΞ΢τͰɺফڈ͢ΔContentΛ಺แ͢ΔContentView ʹߴ͞ࢦఆ͕͋Δͱɺத਎ফڈ͞Εͯ΋ྖҬ͚͕ͩ࢒ͬͯ͠·͍· ͢ɻফڈ͢Δίϯςϯπࣗ਎͕ߴ͞Λܾఆ͢ΔϨΠΞ΢τΛ࡞੒͓ͯ͘͠ඞཁ͕͋Γ·͢ɻ HumburgerMenuView_iOS.cs
  9. All Rights Reserved. Copyright © CRESCO LTD. 14 τοϓϖʔδ<Custom Rendererͷ࣮૷ྫ>

    [assembly:ExportRenderer (typeof(GlobalMenuView), typeof(GlobalMenuView_Droid))]
 namespace HogeHoge.Droid
 {
 public class GlobalMenuView_Droid : ViewRenderer<ContentView, Android.Views.View>
 {
 public GlobalMenuView_Droid ()
 {
 }
 /**
 * Delete Global Menu
 */ 
 protected override void OnElementChanged (ElementChangedEventArgs<ContentView> e){
 base.OnElementChanged (e);
 
 if (e.OldElement != null || Element == null) {
 return;
 }
 e.NewElement.Content = null;
 }
 }
 } GlobalMenuView_Droid.cs AndroidϨϯμϦϯάΫϥεͰ΋iOSಉ༷ɺassembly:ExportRendererఆٛͰForms HamburgerMenuViewΫϥεϨϯμϦϯάޙɺ Android GLobalMenuView_DroidΫϥεΛϨϯμϦϯά͢ΔΑ͏ʹઃఆ͠·͢ɻ iOSͷΈදࣔ͢Δ஫هจݴʹؔͯ͠΋ɺಉ༷ʹAndroidͷϨϯμϦϯάΫϥεͰඇදࣔʹ͍ͯ͠·͢ɻ
  10. All Rights Reserved. Copyright © CRESCO LTD. 15 ʲTips :

    Ϧιʔεͷ؅ཧʳ ɾEmbedded Resource<PCLଆʹڞ௨Ϧιʔεͱͯ͠؅ཧ> ϝϦοτ ϓϥοτϑΥʔϜ͝ͱʹϦιʔεΛ༻ҙ͠ͳͯ͘ྑ͍ ϏϧυΞΫγϣϯΛEmbededResource ͱͯ͠ઃఆ͢Δ σϝϦοτ ෳ਺ղ૾౓ʹରͯ͠ɺ֦େɺॖখͷΈରԠɻ ࢖͍Ͳ͜Ζ ݻఆαΠζͷը૾ ը૾͕ॏཁͳཁҼͰͳ͍ΞϓϦ ɾLocal Resource<֤ϓϥοτϑΥʔϜ͝ͱʹϦιʔεΛ؅ཧ> ϝϦοτ ֤ϓϥοτϑΥʔϜͷ࢓༷ʹଇΔ͜ͱͰɺෳ਺ղ૾౓ʹରԠɻ iOS : BundleResource ͱͯ͠ϦιʔεΛఆٛ͢Δ͜ͱͰɺRetina / ඇRetinaΛࣝผՄೳ AndroidɿAndroidResourceͱͯ͠ϦιʔεΛఆٛ͢Δ͜ͱͰɺෳ਺DPʹରԠɻ σϝϦοτ ϓϥοτϑΥʔϜ͝ͱʹ؅ཧ͕ඞཁ ࢖͍Ͳ͜Ζ ͢ͰʹiOS / AndroidͷϦιʔε͕༻ҙ͞Ε͍ͯΔ৔߹ ը૾͕ॏཁͳཁҼͰ͋ΔΞϓϦ
  11. All Rights Reserved. Copyright © CRESCO LTD. 16 ʲTips :

    Ϧιʔεͷ؅ཧʳ ɾEmbedded Resource<PCLଆʹڞ௨Ϧιʔεͱͯ͠؅ཧ> var image = Xamarin.Forms.ImageSource.FromResource ("HogeHoge.Embeded.common.k_bg_select_area_row.png"); PCLͷC#ίʔυ͔Β࢖༻͢Δ৔߹ ImageSource.FromResource ( ϦιʔεID )ɻϦιʔεID͸ϑΝΠϧͷϓϩύςΟ͔Β֬ೝՄೳɻ XAML͔Β࢖༻͢Δ৔߹ [ContentProperty ("Source")]
 public class ImageResource : IMarkupExtension
 {
 public string Source { get; set; }
 public object ProvideValue (IServiceProvider serviceProvider)
 {
 if (Source == null) return null;
 var imageSource = ImageSource.FromResource(Source);
 return imageSource;
 }
 } <Image Source="{local:ImageResource HogeHoge.Embeded.top.k_img_top.png}" /> ͦͷ··Ͱ͸XAML͔Βݺͼग़͢͜ͱ͕Ͱ͖ͳ͍͕ɺMarkup֦ுΛఆٛ͢Δͱݺͼग़ͤΔΑ͏ʹͳΔɻ ImageResource.cs
  12. All Rights Reserved. Copyright © CRESCO LTD. <!---Bukken List -->


    <ListView 
 ɹɹx:Name="BukkenList"
 ɹɹHorizontalOptions="FillAndExpand">
 ɹɹ<ListView.ItemTemplate>
 ɹɹɹ<DataTemplate>
 ɹɹɹɹ<ViewCell> ɹɹɹɹɹ<ViewCell.View> ɹɹɹɹɹɹ<AbsoluteLayout Padding="0">
 ɹɹɹɹɹɹɹ<ContentView Padding="0" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutBounds="0,0,1,1" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutFlags=“All"> ɹɹɹɹɹɹɹɹ<Image Source="{Binding CellBgImage}" Aspect="Fill" />
 </ContentView>
 <ContentView Padding="0" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutBounds="0,0,1,1" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutFlags=“All"> ɹɹɹɹɹɹɹ<!---Bukken View -->
 <StackLayout 
 ɹOrientation="Horizontal" 
 ɹSpacing="0"
 ɹPadding="5,15,0,15"
 ɹVerticalOptions="FillAndExpand" 
 ɹHorizontalOptions="FillAndExpand">
 ɹɹɹɹɹɹɹɹ<!---Bukken Image -->
 ɹ<ContentView VerticalOptions="FillAndExpand">
 ɹɹ<Image Source="{Binding LeftArrowImage}" Aspect="AspectFit" />
 ɹ</ContentView>
 ɹ<ContentView WidthRequest="60">
 ɹɹ<Image Source="{Binding BukkenImage}" Aspect="AspectFit" />
 ɹ</ContentView>
 ɹ<ContentView VerticalOptions="FillAndExpand">
 ɹɹ<Image Source="{Binding RightArrowImage}" Aspect="AspectFit" /> ɹɹɹɹɹɹɹɹ</ContentView> ɾɾɾɾ
 17 ෺݅Ұཡϖʔδ Xamarin.Formsඪ४ίϯτϩʔϧͷΈͰ࣮૷
  13. All Rights Reserved. Copyright © CRESCO LTD. 18 ෺݅ৄࡉϖʔδ UI෦͸Formsඪ४ίϯτϩʔϧͷΈͰ࣮૷

    ϓϥοτϑΥʔϜݸผ࣮૷ͱͯ͠ɺ ɾϝʔϧ࿈ܞػೳΛ Dependency ServiceͰ࣮૷ ɾి࿩࿈ܞػೳΛ Custom RendererͰ࣮૷
  14. All Rights Reserved. Copyright © CRESCO LTD. 19 ෺݅ৄࡉϖʔδ<ϝʔϧ࿈ܞػೳ iOS>

    PCLଆʹϝʔϧػೳͷΠϯλʔϑΣʔεΛ࣮૷ public interface IMailOpener
 {
 void OpenMail(object context, string to, string subject, string body);
 } iOSଆʹDependencyServiceΛܦ༝ͯ͠ݺͼग़͞ΕΔOpenMailϝιουΛఆٛ [assembly: Dependency (typeof (MailOpener_iOS))]
 namespace HogeHoge.iOS
 {
 public class MailOpener_iOS : IMailOpener
 {
 public MailOpener_iOS (){}
 
 public void OpenMail(object context, string to, string subject, string body){
 
 var escSubject = new NSString(subject);
 escSubject = escSubject.CreateStringByAddingPercentEscapes (NSStringEncoding.UTF8);
 
 var escBody = new NSString(body);
 escBody = escBody.CreateStringByAddingPercentEscapes (NSStringEncoding.UTF8);
 
 var mailUrl = string.Format("mailto://{0}?subject={1}&body={2}",to, escSubject, escBody);
 
 var url = NSUrl.FromString (mailUrl);
 if (UIApplication.SharedApplication.CanOpenUrl (url)) {
 UIApplication.SharedApplication.OpenUrl (url);
 }
 }
 }
 } PCLଆͰͷݺͼग़͠ྫ void OnMailButtonClicked(object sender, EventArgs args) {
 ɹɹobject context = MailButton.myContext;
 ɹɹDependencyService.Get<IMailOpener>().OpenMail(context, myToAddress, mySubject, myBody);
 }
  15. All Rights Reserved. Copyright © CRESCO LTD. 20 ෺݅ৄࡉϖʔδ<ϝʔϧ࿈ܞػೳ Android>

    PCLଆʹϝʔϧػೳͷΠϯλʔϑΣʔεΛ࣮૷ public interface IMailOpener
 {
 void OpenMail(object context, string to, string subject, string body);
 } AndroidଆʹDependencyServiceΛܦ༝ͯ͠ݺͼग़͞ΕΔOpenMailϝιουΛఆٛ [assembly: Dependency (typeof (MailOpener_Droid))]
 namespace HogeHoge.Droid
 {
 public class MailOpener_Droid : IMailOpener
 {
 public MailOpener_Droid (){}
 
 public void OpenMail(object context, string to, string subject, string body){ 
 Intent intent = new Intent(Intent.ActionSend);
 intent.SetType("text/html");
 intent.PutExtra(Intent.ExtraEmail,new String[]{to});
 intent.PutExtra(Intent.ExtraSubject, subject);
 intent.PutExtra(Intent.ExtraText, body);
 
 var currentActivity = context as Activity;
 currentActivity.StartActivity(Intent.CreateChooser(intent, "Send Email"));
 }
 }
 } PCLଆͰͷݺͼग़͠ྫ void OnMailButtonClicked(object sender, EventArgs args) {
 ɹɹobject context = MailButton.myContext;
 ɹɹDependencyService.Get<IMailOpener>().OpenMail(context, myToAddress, mySubject, myBody);
 }
  16. All Rights Reserved. Copyright © CRESCO LTD. 21 ෺݅ৄࡉϖʔδ<ి࿩࿈ܞػೳ iOS>

    PCLଆʹి࿩࿈ܞ༻ϘλϯΫϥεΛ࡞੒ public class TelephoneButton : Button
 {
 ɹɹpublic TelephoneButton ()
 ɹɹ{
 ɹTextColor = Color.Blue;
 ɹVerticalOptions = LayoutOptions.FillAndExpand;
 ɹHorizontalOptions = LayoutOptions.FillAndExpand;
 ɹFontSize = 12;
 ɹɹ}
 } iOSଆʹΧελϜϨϯμϥʔͰϘλϯΫϦοΫ࣌ͷಈ࡞ΛΧελϚΠζ [assembly:ExportRenderer (typeof(TelephoneButton), typeof(TelephoneButton_iOS))]
 namespace HogeHoge.iOS
 {
 public class TelephoneButton_iOS : ButtonRenderer
 {
 public TelephoneButton_iOS (){}
 protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Button> e)
 {
 base.OnElementChanged (e);
 // ΫϦοΫ࣌ͷಈ࡞ॻ͖׵͑
 UIButton button = this.Control;
 button.AddTarget (OpenTelephone, UIControlEvent.TouchUpInside);
 }
 void OpenTelephone(object sender, EventArgs args){
 UIButton button = sender as UIButton;
 var text = string.Format("telprompt://{ 0}", button.TitleLabel.Text); 
 var urlText = Uri.EscapeUriString (text);
 System.Diagnostics.Debug.WriteLine ("OpenTelephone:{0}",urlText);
 var url = new NSUrl (urlText);
 UIApplication.SharedApplication.OpenUrl (url);
 }
 }
 }
  17. All Rights Reserved. Copyright © CRESCO LTD. 22 ෺݅ৄࡉϖʔδ<ి࿩࿈ܞػೳ Android>

    PCLଆ ి࿩࿈ܞ༻ϘλϯΫϥε public class TelephoneButton : Button
 {
 ɹɹpublic TelephoneButton ()
 ɹɹ{
 ɹTextColor = Color.Blue;
 ɹVerticalOptions = LayoutOptions.FillAndExpand;
 ɹHorizontalOptions = LayoutOptions.FillAndExpand;
 ɹFontSize = 12;
 ɹɹ}
 } [assembly:ExportRenderer (typeof(TelephoneButton), typeof(TelephoneButton_Driod))]
 namespace HogeHoge.Droid
 {
 public class TelephoneButton_Driod : ButtonRenderer
 {
 Activity myActivity;
 string myDialText;
 public TelephoneButton_Driod (){}
 protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Button> e)
 {
 base.OnElementChanged (e);
 // ΫϦοΫ࣌ͷಈ࡞ॻ͖׵͑
 myActivity = this.Context as Activity;
 myDialText = e.NewElement.Text;
 var button = this.Control;
 button.Click += OnClickButton;
 }
 
 void OnClickButton(object sender, EventArgs e) {
 var urlText = Android.Net.Uri.Parse ("tel:" + myDialText);
 var intent = new Intent (Intent.ActionView, urlText);
 myActivity.StartActivity(intent);
 }
 }
 } AndroidଆʹΧελϜϨϯμϥʔͰϘλϯΫϦοΫ࣌ͷಈ࡞ΛΧελϚΠζ
  18. All Rights Reserved. Copyright © CRESCO LTD. 24 ࠓ೔ͷຊ୊ ͢Ͱʹ͋ΔiOSɺAndroidωΟςΟϒͰ

    ࡞ΒΕͨΞϓϦΛXamarin.FormsʹҠ২ ͢Δ࣮ͬͯࡍͷͱ͜ΖɺͲ͏ͳͷʁ
  19. All Rights Reserved. Copyright © CRESCO LTD. 25 UI͸ɾɾɾʁ Native

    iOS Xamarin.Forms iOS Native Android Xamarin.Forms Android Xamarin.Formsͷඪ४෦඼͚ͩͰ΋͋Δఔ౓࠶ݱՄೳɻ ϓϥοτϑΥʔϜ͝ͱʹಠࣗͷ࢓༷͕͋Δ৔߹͸Custom RendererͰ࣮૷ɻ ಠࣗ࢓༷͕ଟ͍৔߹͸ɺXamarin NativeͰ࣮૷͢Δํ͕ྑ͍৔߹΋ɻ
  20. All Rights Reserved. Copyright © CRESCO, LTD. 26 ϩδοΫɺϦιʔε͸ɾɾɾʁ #

    ػೳ ڞ௨ ݸผ උߟ 1 ϝΠϯϝχϡʔ ʢάϩʔόϧϝχϡʔʣػೳ ݸผ ֤OSͷUXʹै͍ݸผ࣮૷ 2 ը૾ૉࡐ ڞ௨ େ͖ΊͷαΠζը૾Λ४උɺΞεϖΫτൺΛอͪͭͭॖখͯ͠දࣔ͢Δ͜ͱͰڞ௨ԽՄೳ 3 ը໘ϨΠΞ΢τ ΄΅ڞ௨ άϩʔόϧϝχϡʔɾϋϯόʔΨʔϝχϡʔҎ֎͸ڞ௨Ͱ࣮૷ 4 Ϛοϓදࣔػೳʗ ϚοϓΞϓϦ࿈ܞ ൒ʑ Xamarin.Forms.Mapʹͯ΄΅ڞ௨ԽͰ͖͍ͯΔɻ ϚοϓΞϓϦݺͼग़͠෦෼ͷΈݸผ࣮૷ 5 ి࿩ΞϓϦػೳ࿈ܞ ൒ʑ ֤OSి࿩ΞϓϦݺͼग़͠෦෼ͷΈݸผ࣮૷ ̒ ϝʔϧΞϓϦػೳ࿈ܞ ൒ʑ ֤OSϝʔϧΞϓϦݺͼग़͠෦෼ͷΈݸผ࣮૷ ɾը໘ભҠɺ௨৴ɺϏδωεϩδοΫͳͲجຊ͸ڞ௨ԽՄೳʂ ɾి࿩ɺϝʔϧͳͲσόΠεݻ༗ػೳ͸Dependency ServiceͰݸผ࣮૷ʂ ɾXamarin PluginͳͲ͕ॆ࣮ͯ͘͠Δͱݸผ࣮૷͕ෆཁʹͳΔέʔε΋ɻ ɾEnbedded ResourceͰϦιʔε΋ڞ௨Խ͕Մೳɻ UIʹͩ͜ΘΒͳ͍ͳΒXamarin.FormsͰ؆୯ʹ࡞Εͯ͠·͍·͢ʂ
  21. All Rights Reserved. Copyright © CRESCO, LTD. 28 ·ͱΊ <UI؍఺>

    ɹɾXamarin.FormsͰ΋ඪ४తͳUIͳΒରԠՄೳɻ ɹɾXamarin.Forms PreviewerͰXAMLϓϨϏϡʔ΋αϙʔτ^^ ɹɾUIಠࣗ࢓༷͕ଟ͍৔߹͸Xamarin.NativeΛݕ౼͢΂͖ɻ <Ϧιʔε؍఺> ɹɾEnbedded ResourceͰڞ௨ԽՄೳɻ ɹɾ͢Ͱʹ֤ϓϥοτϑΥʔϜղ૾౓͝ͱͷϦιʔε͕͋ΔͳΒ ɹɹϓϥοτϑΥʔϜ͝ͱʹ༻ҙ͢Δํ͕͍͍ɻ ʻϩδοΫ؍఺ʼ ɹɾը૾Ճ޻ܥ΍σόΠεݻ༗ػೳΛ͝Γ͝Γ࢖͏΋ͷͰͳ͚Ε͹ ɹɹXamarin.FormsͰ͋Δఔ౓ڞ௨ԽͰ͖Δɻ ʻ࠶ར༻ੑʼ ɹɾFormsͳΒUI͸εΫϥονͱಉ౳ ɹɾΞϧΰϦζϜ͸͋Δఔ౓࢖͍·ΘͤΔ͕ɺC#Ͱॻ͖௚͕͠ඞཁɻ ɹɾͦΕͳΓʹॳظίετ͸͔͔Δ͕ɺอकӡ༻අ༻͸Լ͕Δɻ
  22. All Rights Reserved. Copyright © CRESCO, LTD. 29 Xamarin.Forms։ൃͷϓϩδΣΫτମ੍ Xamarin.FormsΛ࢖༻͢Δ͜ͱͰɺඪ४తͳUI΍σόΠεʹґଘ͠ͳ͍ػೳ͸εϚϗະܦݧͰ΋”։ൃ”

    ͸Մೳͱ͍͑·͢ɻ͔͠͠ɺڽͬͨUI΍σόΠεݻ༗ͷػೳɺͦͷଞϏϧυ΍ϦϦʔεʹؔͯ͠͸ɺͦ ΕͧΕͷOSͷಛੑΛཧղ͢Δඞཁ͕͋Γ·͢ɻ੡඼ϨϕϧͷΞϓϦΛ։ൃ͢Δʹ͸ɺ֤ϓϥοτ ϑΥʔϜͷ։ൃܦݧऀΛΞαΠϯͤ͞Δඞཁ͕͋Γ·͢ɻฐࣾͰ͸ɺ֤ϓϥοτϑΥʔϜ։ൃऀ΋ަ͑ ͯϓϩδΣΫτମ੍Λ૊Ή͜ͱ͕ՄೳͰ͢ɻ ϓϩδΣΫτ Ϛωʔδϟ ITΞʔΩςΫτ Android Developer .NET Developer iOS Developer ։ൃϦʔμʔ
  23. All Rights Reserved. Copyright © CRESCO, LTD. 30 ৄ͘͠ฉ͖͍ͨํ͸ɺɺɺ 5/18(ਫ)ʹΤΫηϧιϑτ͞·ɺΫϨείͷ߹ಉओ࠵ͷXamarinϏδωεηϛφʔΛ࣮ࢪ͠·͢ɻ

    http://service.cresco.co.jp/seminar_event.shtml PepperʹΑΔσϞ΋͋Γ·͢ɻ ͓༠͍߹Θͤͷ্͝ࢀՃ͍ͩ͘͞ɻ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ