単純な正弦波の動きをアニメーション化するために OxyPlot を使用しています。
void ViewMotion()
{
foreach (File item in LoadedFiles())
{
LineSeries skeleton = new LineSeries();
skeleton.MarkerType = MarkerType.Circle;
skeleton.MarkerSize = 10;
AnimationPlot.Series.Add(skeleton );
var worker = new BackgroundWorker { WorkerSupportsCancellation = true };
foreach (Channel node in item.ChannelAnim)
{
double x = 0;
worker.DoWork += (s, e) =>
{
while (!worker.CancellationPending)
{
x += 0.02;
if (skeleton.Points.Count > 0)
{
skeleton.Points.Remove(ss.Points.First());
}
skeleton.Points.Add(new DataPoint(50, 50 + (30 + x) * Math.Sin(x)));
AnimationPlot.RefreshPlot(true);
MessageBox.Show("");
Thread.Sleep(25);
}
};
}
worker.RunWorkerAsync();
}
}
基本的にはドットが上下するだけです。イベントが一度しかトリガーされないため、モーションが表示されず、最初の位置が表示されるという問題。これはバインディングの問題ではなく、イベントに問題があります。順序を変更しようとしましたが、成功しませんでした。
ちなみに、これは正しく機能しています: (2 つのドットが上下に移動)
ScatterSeries ss = new ScatterSeries();
ScatterSeries ss2 = new ScatterSeries();
public void TemporalMethod(object param)
{
ss.MarkerType = MarkerType.Circle;
ss.MarkerSize = 20;
ss.MarkerFill = OxyColors.Violet;
MyModel.Series.Add(ss);
ss2.MarkerType = MarkerType.Triangle;
ss2.MarkerSize = 20;
ss2.MarkerFill = OxyColors.Green;
MyModel.Series.Add(ss2);
var worker = new BackgroundWorker { WorkerSupportsCancellation = true };
double x = 0;
double y = 0;
worker.DoWork += (s, e) =>
{
while (!worker.CancellationPending)
{
x += 0.02;
y += 0.001;
if (ss.Points.Count > 0)
{
ss.Points.Remove(ss.Points.First());
}
if (ss2.Points.Count > 0)
{
ss2.Points.Remove(ss2.Points.First());
}
ss.Points.Add(new DataPoint(50, 50 + (30 + x) * Math.Sin(x)));
ss2.Points.Add(new DataPoint(55, 50 + 30 * Math.Sin(x + y)));
MyModel.RefreshPlot(true);
Thread.Sleep(25);
}
};
worker.RunWorkerAsync();
}
編集:解決策はかなりばかげています、私は誤って書きました
if (skeleton.Points.Count > 0)
{
skeleton.Points.Remove(ss.Points.First());
}
それ以外の:
if (skeleton.Points.Count > 0)
{
skeleton.Points.Remove(skeleton.Points.First());
}
理由はわかりませんが、エラーは発生していません。