我正在开发一个 Xamarin.Android 应用程序,该应用程序引用带有视图模型的可移植类库。正在使用 MvvmCross。我需要一个计时器,它每次“滴答”时都会更新 UI。我似乎无法让它更新用户界面。正如使用调试器所确认的那样,它每秒都在执行 Tick 方法。我需要使用 RunOnUiThread 方法,但我不确定如何在 Xamarin 中实现它。一个导致更新 UI 线程的代码示例将不胜感激。
股票代码.cs:
using System;
using Pong.Core.Models;
using Pong.Core.ViewModels;
using System.Threading;
namespace Pong.Droid
{
public class Ticker
{
private readonly Timer _dispatcherTimer;
private readonly GamePlayViewModel _viewModel;
public Ticker(GamePlayViewModel viewModel)
{
_viewModel = viewModel;
TimerCallback timerDelegate = new TimerCallback (Tick);
_dispatcherTimer = new Timer (timerDelegate, null, 0, 1000);
}
public void Tick(object state)
{
_viewModel.Number++;
//_viewModel.UpdateBall();
//_viewModel.UpdatePaddle1();
}
}
}
活动:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Pong.Core.ViewModels;
using Cirrious.MvvmCross.Droid.Views;
using Android.Content.PM;
namespace Pong.Droid
{
[Activity (Label = "GamePlayView", ScreenOrientation = ScreenOrientation.Landscape)]
public class GamePlayView : MvxActivity
{
private GamePlayViewModel _vm;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.GamePlayView);
_vm = new GamePlayViewModel();
DataContext = _vm;
var ticker = new Ticker(_vm);
}
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="40dp"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="40dp"
local:MvxBind="Text Number" />
</LinearLayout>
视图模型:
using Pong.Core.Models;
using System.Diagnostics;
using Cirrious.MvvmCross.ViewModels;
namespace Pong.Core.ViewModels
{
public class GamePlayViewModel : MvxViewModel
{
protected Paddle Paddle1;
private Paddle _paddle2; // Not yet implemented
protected StandardBall StandardBall;
public int Number { get; set; }
public GamePlayViewModel()
{
Paddle1 = new Paddle();
StandardBall = new StandardBall();
Number = 1;
}
public void UpdatePaddle1()
{
switch (Paddle1.DetectWallCollision())
{
case "upper":
Paddle1.UpperWallHit();
break;
case "lower":
Paddle1.LowerWallHit();
break;
case "none":
Paddle1.MoveOneFrame();
break;
}
}
public void UpdateBall()
{
if (StandardBall.DetectWallCollision()) StandardBall.HandleWallCollision();
StandardBall.MoveOneFrame();
}
public void SetPaddleDirection(string direction)
{
Paddle1.SetDirection(direction);
}
public void StopPaddle()
{
Paddle1.StopMoving();
}
}
}