正在學Xamarin.Forms,順便用之前WPF的專案修改,原本想共用ViewModel,不過繪圖的部份改用SkiaSharp,加上原先並沒有把繪圖的部份分開,所以就重寫了XD。
初步成果如下圖: 

程式的部份還是採用MVVM,另還用了XF範例中的EventToCommand方式,如下程式:
<skia:SKCanvasView x:Name="canvasView" Grid.Row="0">
            <skia:SKCanvasView.Behaviors>
                <jackTimingApp:EventToCommandBehavior Command="{Binding PaintSurfaceCommand}"
                EventName="PaintSurface" />
            </skia:SKCanvasView.Behaviors>
        </skia:SKCanvasView>
這樣子繪圖的部份就由ViewModel包了,當然這次把繪圖的動作分開了,如下所示:
PaintSurfaceCommand = new Command((arg) =>
{
    var args = arg as SKPaintSurfaceEventArgs;
    var info = args.Info;
    var surface = args.Surface;
    var canvas = surface.Canvas;
    if (_bitmap == null)
        _bitmap = new SKBitmap(info);
    if (_drawEngine == null)
        _drawEngine = new SkiaDrawEngine(_bitmap);    
    TimingDatas = TimingMapParser.Parse(TimingData);
    _bitmap = _drawEngine.Draw(TimingDatas);
    canvas.DrawBitmap(_bitmap, 0, 0);
    UpdateTimingDiagram();
});
而實際更新canvas的動作就交由XF內建的MessagingCenter來完成:
public MainPage(MainViewModel vm)
{
    InitializeComponent();
    BindingContext = vm;
    MessagingCenter.Subscribe<MessageToken>(this, "message", (item) =>
    {
        switch (item.TokenType)
        {
            case MessageTokenType.UpdateTimingDiagram:
                DrawTiming();
                break;
        }
    });
}
private void DrawTiming()
{
    canvasView.InvalidateSurface();
}
繪圖的部份還有滿多可以調整的,另外也沒有加上檔案的處理,但介面的部份感覺不太適合App的承現,有時間再調整了…
Written with StackEdit.
沒有留言:
張貼留言