, Rx Forum ( , ):
β1: . Observable.Context 4 .
β 2: Javascript , Rx .
, , :
void Form1_Load(object sender, EventArgs e)
{
Reactive("Time flies like an arrow");
}
private void Reactive(string msg)
{
var mousemove = Observable.FromEvent<MouseEventArgs>(this, "MouseMove");
var message = msg.ToCharArray();
for(int i = 0; i < message.Length; i++)
{
var l = new Label()
{
Text = message[i].ToString(),
AutoSize = true,
TextAlign = ContentAlignment.MiddleCenter
};
int closure = i;
mousemove
.Delay(TimeSpan.FromSeconds(0.07 * i), Scheduler.Dispatcher)
.Subscribe(e =>
{
l.Left = e.EventArgs.X + closure * 12 - 5;
l.Top = e.EventArgs.Y + 15;
});
Controls.Add(l);
}
}
ObserveOnDispatcher SubscribeOnDispatcher. Javascript, - .
UPDATE, ββ
, Rx:
private void Unreactive(string msg)
{
var message = msg.ToCharArray();
for(int i = 0; i < message.Length; i++)
{
var l = new Label()
{
Text = message[i].ToString(),
AutoSize = true,
TextAlign = ContentAlignment.MiddleCenter
};
Controls.Add(l);
int closure = i;
this.MouseMove += (s, e) => LabelDelayMove(closure, e, l);
}
}
private void LabelDelayMove(int i, MouseEventArgs e, Label l)
{
Point p = new Point(e.X + i * 12 - 5, e.Y - 15);
var timer = new System.Threading.Timer((_) => LabelMove(l, p), null, i * 70, System.Threading.Timeout.Infinite);
}
private void LabelMove(Label l, Point location)
{
this.BeginInvoke(new Action(() => l.Location = location));
}