.NET CoreおよびAvaloniaでのクロスプラットフォームの新年デモ

AAA!.NET Coreǃに書き換える時が来ました 」と彼らは言った、WPFはコメントで議論した。 .NET / C#でクロスプラットフォームのGUIアプリケーションを作成できるかどうかを確認しましょう。













クリスマス気分は、雪が降るアニメーションを作成するというアイデアに影響を与えました。 DOSでのデモ、燃える火、フラクタル、クリスマスツリーに降る雪などがありました。







以下で説明するように、これは楽しいだけでなく、UIフレームワークの主要な機能を体験することもできます。 行こう!







プロジェクトとUIの作成



Avaloniaには、プロジェクトテンプレートを備えたVisual Studio拡張機能があります。 Avalonia .NET Core Application



をインストールして作成しAvalonia .NET Core Application



。 おなじみのWPF App.xaml



App.xaml



表示されます。 ただし、プロジェクトには<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>



が含まれているため、これを<TargetFramework>netcoreapp2.0</TargetFramework>



に変更しますが、石器時代ではありません。







スタジオ用のAvalonia拡張機能にはXAML Designerが含まれていますが、それはうまくいきませんでした。 Resharperはマークアップエディターに少し夢中になり、どこにでも明示的な名前空間を挿入したいので、彼なしでも実行できます。







それ以外の場合は、通常のコントロールとプロパティを備えた使い慣れたXAMLを手にしています。 すべての違いはドキュメントに記載されています







任意の描画には、WPFのWriteableBitmap



という名前があります。 大きな利点は、ストリームからの描画に問題がないことです;このように見えます:







 <Image Source="{Binding Bitmap}" Stretch="Fill" />
      
      





 using (ILockedFramebuffer buf = writeableBitmap.Lock()) { uint* ptr = (uint*) buf.Address; //  *ptr = uint.MaxValue; }
      
      





ただし、writeableBitmapにバインドされているImage



、それ自体では更新されないため、 InvalidateVisual()



する必要があります。







したがって、UIスレッドをロードせずに、バックグラウンドスレッドでアニメーションを描画できます。 Image



加えて、降雪の速度と雪片の数を制御するためのスライダーをいくつか追加します。すべてがここで標準である{Binding Mode=TwoWay}



です。 さらに、「最初からやり直す」ボタンもICommand



への標準バインディングです。 GoogleからコピーされたベクターのXAMLアイコンが使用されていることに注意してください。 <Path>



は期待どおりに機能します。







レイアウト全体: MainWindow.xaml







雪のアルゴリズム



「物理学」



スノーフレークを1ピクセル下に移動します。 ピクセルが既に「横たわっている」スノーフレークで占められている場合は、左右のポイントを確認し、空いている場所に移動します。 すべてが忙しい-ポイントを「横たわっている」とマークします。 したがって、傾斜面からの雪片の転がりが達成されます。







視差



ボリューム効果を実現するために、各スノーフレークにランダムな速度を割り当てます。 速度が遅いほど、描画に使用する陰が濃くなります。







「物理」が正しく機能するためには、フレームごとに1ピクセル以下の雪片を移動する必要があります。 つまり、最速の雪片はピクセルごとに各フレームを移動し、残りはいくつかのフレームをスキップします。 これを行うには、 float



座標を適用し、各フレームで各スノーフレークを単純に再描画します。 代わりに、2つの整数のshort



フィールドを使用し、スノーフレークが実際に移動した場合にのみ再描画します。







レンダリング



主なアイデアは、フレームの完全な再描画を回避することです。 「うそをつく」雪、ユーザー描画のドット、アップロードされた画像を保存する必要があります(はい、マウスで描画し、右クリックでpicciを読み込むことができます-雪玉はクリスマスツリーと碑文にくっつきます)。







シンプルで効果的なソリューションは、 WriteableBitmap



自体を使用することです。 「永続的な」ピクセルを完全に不透明にし(A = 255)、雪片を動かす場合はA = 254にします。







落下する雪片は常に、アレイに保存されているそれぞれの固定数、位置、速度です。 その結果、スノーフレークが移動した場合-古い位置のポイントを消去し、新しい位置に描画します。 「横たわる」ものに変わった場合-ポイントのアルファチャンネルを255に設定し、ライブドロップをトップに戻します。







実行方法



直接「ライブ」で描画する可能性のおかげで、かなり厄介なことが判明しました:)







すべてのオペレーティングシステムで、手順は同じです。









おわりに



.NET Coreはまだ若く、Avaloniaはまだアルファ版ですが、現在これらのツールはタスクを解決しています! コードはシンプルでわかりやすく、ハックや余分なスクワットはありません。Windows、macOS、Linuxで正常に動作します。







代替案?









このデモのUIは非常にシンプルですが、いくつかの最も重要な機能を使用しています。









これは、すでに複雑なUIを構築するのに十分です。 したがって、.NETエコシステムの最後のギャップは閉じられていると言えます..NET標準ライブラリに配置することでコードを再利用しながら、Web(ASP.NET Core)、モバイル(Xamarin)、デスクトップ(Avalonia)アプリケーションを作成することが可能です。







参照資料






All Articles