Xamarin FormsでのViewのスケーリング


Viewのスケーリング

今作っているアプリで、Window内に仮想的な大きさのキャンパスを作りその中のレイアウトは崩さずにウィンドウのサイズに応じて全体のスケールを変えたいって思って色々探ってみました。

WPFだと、下のように書けば一発で中身の表示のスケーリングを調整できるので便利だったから、、Xamarinでもあるかなぁと思ったら、、、ない。

<DockPanel>
    <DockPanel.RenderTransform>
        <ScaleTransform ScaleX=“{Binding Scale}" ScaleY="{Binding Scale}" />
    </DockPanel.RenderTransform>
</DockPanel>

VisualElementのscaleについて

ではコントロールに自分自身のスケールを設定するプロパティはあるのかなと思ったら”Scale”というプロパティがありました。

試しにサイズが半分になる事を期待して値に0.5を入れてみました。

が、見た目変わらず。 Scaleプロパティがx, yに分かれていない事にも違和感があるし用途が違うのかな?

これはこれ以上は深追いするのはやめて別のアプローチを探すことに。

代案 泥臭くサイズ調整する

いろいろ考えた結果素直にContentViewのSizeChangedを拾って、等倍のときの大きさからの変化率を計算し調整することにしました。

SizeChangedをViewにアタッチしたBehavior内で受け取って、それをCommandでViewModelに伝えています。

その際、PrismのEventToCommandBehaviorを使ってViewModelとつなげようとしたのですが上手く行かず(EventArgsに値がなくEventArgsConverterにsenderを渡せなくて断念)、SizeChangedに特化したBehaviorを新規で作り対応しました。

今の所この手法で期待する動作が実現できています。

さらに別の方法

実際に試してはないのですが、Xamarin Formsのコントロールとして画面に描画するのではなく、一旦Bitmapに表示を全て描画すればスケーリングも簡単にできそうかなと思ってます。

(変更規模が大きいのとXamlでのUI作成ができなくなるので、しばらく試す予定はなし)