2

以下は、WPF でのブラウン運動のデモです。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Threading;

namespace WpfBrownianMotion
{
    static class MiscUtils
    {
        public static double Clamp(this double n, int low, double high)
        {
            return Math.Min(Math.Max(n, low), high);
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Width = 500;
            Height = 500;

            var canvas = new Canvas();

            Content = canvas;

            var transform = new TranslateTransform(250, 250);

            var circle = new Ellipse()
            {
                Width = 25,
                Height = 25,
                Fill = Brushes.PowderBlue,
                RenderTransform = transform
            };

            canvas.Children.Add(circle);

            var random = new Random();

            var thread =
                new Thread(
                    () =>
                    {
                        while (true)
                        {
                            Dispatcher.Invoke(
                                DispatcherPriority.Normal,
                                (ThreadStart)delegate()
                                {
                                    transform.X += -1 + random.Next(3);
                                    transform.Y += -1 + random.Next(3);

                                    transform.X = transform.X.Clamp(0, 499);
                                    transform.Y = transform.Y.Clamp(0, 499);
                                });
                        }
                    });

            thread.Start();

            Closed += (s, e) => thread.Abort();
        }
    }
}

私の質問はこれです。このような場合、標準の WPF アニメーション機能が使用されていない場合、上記の方法を使用ThreadしてDispatcher、推奨される方法はありますか?

一般に、状態を更新してレンダリングする必要があり、アニメーション機能が適切でない場合があります。そのため、別のスレッドで更新とレンダリングを行う方法が必要です。上記のアプローチが正しいかどうか疑問に思っています。

4

1 に答える 1

0

上記のコメントの Clemens は、 を使用することを提案しDispatcherTimerました。実際、これによりコードがかなり単純化されます。そのアプローチをとるバージョンは次のとおりです。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfBrownianMotion
{
    static class MiscUtils
    {
        public static double Clamp(this double n, int low, double high)
        {
            return Math.Min(Math.Max(n, low), high);
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Width = 500;
            Height = 500;

            var canvas = new Canvas();

            Content = canvas;

            var transform = new TranslateTransform(250, 250);

            var circle = new Ellipse()
            {
                Width = 25,
                Height = 25,
                Fill = Brushes.PowderBlue,
                RenderTransform = transform
            };

            canvas.Children.Add(circle);

            var random = new Random();

            var timer = new DispatcherTimer();

            timer.Tick += (s, e) =>
                {
                    transform.X += -1 + random.Next(3);
                    transform.Y += -1 + random.Next(3);

                    transform.X = transform.X.Clamp(0, 499);
                    transform.Y = transform.Y.Clamp(0, 499);
                };

            timer.Start();
        }
    }
}
于 2012-11-01T12:35:13.683 に答える