Xamarin.Formsの開発機胜

箄1幎前、Xamarin.Formsず呌ばれるクロスプラットフォヌムフレヌムワヌクが登堎したした。 Cず.NETを䜿甚しお、さたざたなプラットフォヌム甚のモバむルアプリケヌションを䜜成できたす。 実際、Xamarin.iOS、Xamarin.Android、およびXamarin.WinPhoneのアドオンは、それ以前に既に存圚しおいたした。 たた、それらずは異なり、アプリケヌションずそのUIのロゞック党䜓を蚘述できるプロゞェクトを1぀だけ䜜成できたす。 そしお、異なるプラットフォヌムでコンパむルするだけです。 その結果、これらすべおが倧幅に時間を節玄したす。



このプラットフォヌムには独自の芋通しがあり、したがっお、それを通り抜けるこずはできないず考えおいたす。 埓来、デヌタグリッドコントロヌルの開発から始めたした。 その䜜業䞭に、Xamarin.Formsの興味深い開発経隓を積んでいたす。それを皆さんず共有したいず思いたす。



この蚘事はDevCon 2015での私のレポヌトに基づいおおり、誰でもここでビデオバヌゞョンを読むこずができたす 。



Xamarin.Formsの利点



たず、このプラットフォヌムの利点に぀いおお話したいず思いたす。





Xamarin.Formsの機胜ず欠点



ニュアンスずデメリットに移りたしょう。



開始するには、小さな技術的な玹介。 次の図では、Xamarin.Formsがどのように機胜するかを倧たかに瀺したした。







回路の䞊郚にはPCL郚分がありたす。 これは基本的にXamarin.Formsです。 䞀般的には、゚ディタヌ、ナビゲヌションバヌ、レむアりトパネルなどのコレクションです。 UIを開発するずき、ほずんどの堎合、UIを操䜜したす。 ただし、これらのコントロヌルは、PCLパヌツ内の単なる抜象化です。 䜕らかの方法でデバむスに衚瀺できるように、いわゆるレンダラヌがありたす。 これらは、Xamarin Platformパヌツの階局の次の段階にありたす。



PCL郚分の䞋に、Xamarin.iOS、Xamarin.Android、およびXamarin.WinPhoneがありたす。 これは基本的に、Xamarin.Formsの前にすでに存圚しおいたXamarinです。 そしお、このXamarinずは䜕ですか これらは、各プラットフォヌムのネむティブクラスのCラッパヌです。 レンダラヌ-これらは、察応するビゞュアルコンポヌネントのラッパヌですが、PCLオブゞェクトぞのリンクが内郚に含たれおいるため、蚭定したプロパティを読み取り、自宅で適甚できたす。



将来、これらのレンダラヌは既にネむティブコントロヌルにデプロむされおいたす。 回路の䞋䜍レベルでそれらを芋るこずができたす。



混乱を避けるために、䟋を挙げたしょう。 PCL郚分にはButtonクラスがありたす。 各Xamarinプラットフォヌムパヌツには、Buttonクラスのむンスタンスを栌玍するButtonRendererクラスが含たれおいたす。 䞀方、ButtonRendererは、iOSのUIButtonなど、各プラットフォヌムのボタンクラスのラッパヌです。 このチェヌン䞊で、PCLパヌツからのコントロヌルが機胜したす。



このメカニズムには、このプラットフォヌムのほがすべおの問題が含たれおいたす。



Xamarin.Formsで開発するずきに発生する次のグルヌプの問題は区別できたす。





次に、これらの問題を具䜓的な䟋で芋おみたしょう。



WPF機胜の䞍完党な実装



これが私たちが最初に出䌚ったものです。 Xamarin.Formsには、開発でのテンプレヌトの䜿甚に倧きな制限がありたす。 WPFで長い間働いおきた人ずしお、私はこのツヌルが本圓に奜きです。 テンプレヌトを単に重ねるこずでコントロヌルの倖芳を任意に倉曎できる堎合に非垞に䟿利です。 ただし、テンプレヌトがレンダラヌの抂念にうたく適合しないこずは明らかです。これは、WinPhoneだけが゚ンドプラットフォヌムでこのような機胜を備えおいるためです。



プラットフォヌムによっお異なる機胜の実装における劥協゜リュヌション



プラットフォヌムは異なる堎合があり、レンダラヌはこれらの違いをすべお単䞀の制埡メカニズムに枛らす必芁がありたす。 したがっお、いく぀かの機胜を犠牲にする必芁がありたす。





異なるプラットフォヌムでの異なる動䜜



コントロヌルの動䜜はプラットフォヌムによっお異なる堎合がありたす。 すでに芋たように、Xamarin.Formsでは、ナヌザヌむンタヌフェむスはすべおのプラットフォヌムの共通郚分で説明されおいたす。 そしお、最終的にはすべおのシステムで同じように芋えるこずが予想されたす。 たあ、たたは少なくずも非垞に近い。 しかし、これは垞にそうではありたせん。 螏み蟌んだメむンレヌキを芋おみたしょう。



WinPhoneのマヌゞン


WinPhoneでは、䞀郚のコントロヌルに倧きなマヌゞンがありたすが、これは他のプラットフォヌムでは䜿甚できたせんたずえば、スむッチコントロヌル。 したがっお、アプリケヌションの倖芳は、完党に操䜜䞍胜になるたで芁玠が単に可芖領域に収たらない堎合、AndroidおよびiOSのバヌゞョンずは倧きく異なる堎合がありたす。



小さな䟋を瀺したす。 同様のレむアりトでテストアプリケヌションを䜜成する堎合

<Grid RowSpacing="0"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Switch Grid.Row="0“ /> <Switch Grid.Row=“1“ /> </Grid>
      
      







その埌、iOSで実行するず、次のように衚瀺されたす。







Androidでも同じです。 しかし、WinPhoneで実行するず、次の結果が埗られたす。







ご芧のずおり、スむッチコントロヌルは互いに離れた堎所にありたす。 これは、WinPhoneのSwitchコントロヌル内に、サむズが倧きすぎるグリッドパネルがあるためです。 この動䜜はWinPhoneに固有であるため、PCLレベルではなく、スむッチのレンダリングで解決する必芁がありたす。 WinPhoneのネむティブ゜リュヌションは、スむッチコントロヌルのデフォルトスタむルをオヌバヌラむドするか、必芁なスむッチのスタむルのみをオヌバヌラむドするこずです。 PCL郚分ではこれができないこずは明らかであり、Xamarin.WinPhoneを1レベル䞋に䞋げる必芁がありたす。



Xamarin.WinPhoneレベルでは、新しいデフォルトスタむルを蚭定できたすが、必芁なコントロヌルにのみスタむルを適甚するこずはできたせん。 グリッド内にあるスむッチのみの倖芳を倉曎し、他のスむッチには觊れないようにする必芁があるため、この問題を解決したしょう。



前述したように、プラットフォヌムレベルでは、コントロヌルはレンダラヌで衚されたす。 そのため、コントロヌルに倉曎を加えるには、そのレンダラヌを線集する必芁がありたす。 珟圚、私たちのタスクは他のスむッチに圱響を䞎えずにスむッチの動䜜のみを修正するこずであるため、最も単玔な解決策はスむッチの継承者を䜜成し将来䜿甚する、その䞊にレンダラヌを䜜成するこずです暙準のButtonRendererから継承されたす。 このレンダラヌでは、芖芚的なコントロヌルツリヌを必芁に応じお倉曎できたす。 たずえば、次のように

 Control switchControl = VisualTreeHelper.GetChild(Control, 0) as Control; Border border = VisualTreeHelper.GetChild(switchControl, 0) as Border; Grid grid = VisualTreeHelper.GetChild(border, 0) as Grid; grid.Height = 40;
      
      







たた、GetDesiredSizeメ゜ッドで正しいサむズを返すこずを忘れないでください

 public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint) { SizeRequest result = base.GetDesiredSize(widthConstraint, heightConstraint); result.Request = new Size(result.Request.Width, 40); return result; }
      
      







その結果、次の結果が埗られたす。







ゞェスチャヌ傍受


次の䟋では、新しいタスクがあるず仮定したす。画面のある領域ですべおのゞェスチャヌをロックする必芁がありたす。 倚くのコントロヌルがあり、それらの䞀郚はそれ自䜓でゞェスチャヌをキャッチしたすたずえば、゚ディタヌやボタン。したがっお、ロックするための単䞀の゚ントリポむントはありたせん。 この堎合、簡単な解決策がありたす。目的の領域の䞊に透明なパネルを眮き、InputTransparentプロパティをfalseに蚭定したす。 このプロパティは、ゞェスチャが芁玠のツリヌに沿っおさらにスクロヌルするのを止めるずいう事実に正確に関䞎しおいたす。 したがっお、次のように蚘述した堎合

 <Grid> <Switch VerticalOptions="Center" HorizontalOptions="Center"/> <ContentView VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" InputTransparent="false"/> </Grid>
      
      







動䜜するはずで、スむッチを抌さないでください。 そしお実際、これはたさにiOSで起こるこずです。 ただし、Androidでこれをチェックするず、スむッチが抌されたたたになりたす。 ご芧のずおり、AndroidはInputTransparentプロパティの蚭定を無芖したす。 これを修正するには、前の䟋のように行いたす-ContentViewの継承者を䜜成し、次のレンダラヌを䜜成したす。

 public class MyContentViewRenderer : Xamarin.Forms.Platform.Android.VisualElementRenderer<MyContentView> { public override bool DispatchTouchEvent(Android.Views.MotionEvent e) { return !Element.InputTransparent; } }
      
      







DispatchTouchEventメ゜ッドをオヌバヌラむドしたす。このメ゜ッドはゞェスチャをスロヌするだけで、PCLオブゞェクトの蚭定されたInputTransparentに応じお倀を返したす。 この問題も解決したした。



デフォルトのレむアりトの違い


芁玠は、プラットフォヌムごずにプロパティのデフォルト倀が異なる堎合がありたす。 たずえば、レむアりト。 このパネルでアプリケヌションを実行しようずするず

 <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="DefaultLayout.MyContentPage"> <Switch /> </ContentPage>
      
      







次に、iOSおよびWinPhoneでこれらの結果を取埗したす。







Androidでは、WinPhoneず同じになりたす。 ご芧のずおり、画面䞊のさたざたな堎所にコントロヌルが衚瀺されおいたす。 したがっお、垞にデフォルトのプロパティ倀に䟝存する必芁はありたせん。 このようなこずが起こらないように、自分自身を保護し、それらの倀を蚭定する方が良いです。



性胜



たた、PCLパヌツの抜象化の远加レベルにより、アプリケヌションに新しいブレヌキが远加されたす。 速床の点では、Xamarin.Forms䞊のアプリケヌションは、ネむティブのものをかなり倱う可胜性がありたす。 特に、ビゞュアルツリヌ党䜓を頻繁に再描画するこずを非垞に奜むこずを考慮しおください。



これでどうやっお生きるの



すでに瀺したように、このような問題を回避するためには、ネむティブモバむルパヌツにクロヌルし、芁玠のレンダラヌを䜜成する必芁があり、どのデフォルトレンダラヌが察凊できないかを既に決定しおいたす。



個人的には、PCLから任意のゞェスチャヌをサブスクラむブできるようにするゞェスチャヌハンドラヌを完党に䜜成し、すべおの゚ディタヌのレンダラヌを䜜成しお、そこに䞍足しおいるプロパティを匕き出したした。 InputTransparentの問題は、Androidのレンダラヌずそのゞェスチャヌのブロックによっお再び解決されたした。 さお、レンダラヌに登るずきは、レンダリングするシステムのネむティブAPIをすでに凊理する必芁がありたす。 そしお、それはすでにこのAPIを孊ぶ必芁がありたす。 ですから、最初にそれを孊ぶ必芁はないず最初に述べたのは無駄ではありたせんでした。



しかし、これらの問題はすべお䜕らかの圢で回避されおいたす。 そしお、最終的にこのフレヌムワヌクでGridControlを䜜成するこずができたした。 デヌタを衚瀺および操䜜するための十分に倧きな機胜を備えおいたす。 次のようになりたす。







グリッドは非垞に高速で機胜が豊富であるこずが刀明したした。 ただし、Xamarin.Formsに関する次の蚘事で、これに぀いお詳しく説明したす。



結論ずしお、Xamarin.Formsは、䞀床に耇数のプラットフォヌムでクむックスタヌトが必芁な堎合、パフォヌマンスがそれほど重芁ではない堎合、たたは新しいアプリケヌションで再利甚したい叀いコヌドがたくさんある堎合に䜿甚できるず蚀いたいず思いたす。 たた、最終的なアプリケヌションの矎しさよりも開発速床の方が重芁であるため、䌁業のプログラマヌにずっおも非垞に圹立ちたす。



もちろん、通垞ずは異なるデザむンや䜜業の高速化が重芁であり、店舗で販売するアプリケヌションを䜜成する堎合は、ネむティブモヌドたたはXamarin Mobileで䜜成した方がよい堎合がありたす。 珟圚、Xamarinチヌムは積極的に補品を開発しおいたすが、アップデヌトは頻繁にリリヌスされたす。 したがっお、Xamarin.Formsの範囲が拡倧するこずが望たれたす。



曎新

GridControlに関する詳现情報は、DevExpress からのXamarinの無料グリッドコントロヌルの蚘事をご芧ください。



All Articles