0

ユーザーがキーを押している間、ウィンドウ内の形状を移動したい。私はこれに慣れていないので、このアプローチを試しましたが、別のスレッドに属しているため、新しいスレッドから circle.RederTransform を変更できません。それはどのように行われるべきですか?

    public partial class MainWindow : Window
    {
        private Matrix transformationMatrix = Matrix.Identity;
        private Thread myThread = null;
        private bool isGoing = false;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            isGoing = true;
            myThread = new Thread(HandleMyThread);
            myThread.Start();
        }

        private void Window_KeyUp(object sender, KeyEventArgs e)
        {
            isGoing = false;
        }

        private void HandleMyThread(object obj)
        {
            while(isGoing)
            {
                transformationMatrix.Translate(10, 0);
                circle.RenderTransform = new MatrixTransform(transformationMatrix);
                Thread.Sleep(50);
            }
        }

    }
4

2 に答える 2

0

...を使用するだけでうまくいくかもしれませんが、Invokeやりたいことを行うためのより良い方法があります。

まず、 を処理するたびにスレッドを作成するのKeyDownは効率が悪く、問題が発生する可能性がありThreadます。

さらに、複数のスレッドが存在し続けると混乱する可能性があります。たとえば、誰かがキーを繰り返し押したり離したりしたとします....その場合、isGoingフラグが true であるため、「古い」スレッドがまだ実行され続ける可能性があります....つまり、同期が不十分です。

private void HandleMyThread(object obj)
{
    Action action = new Action( ()=>
    {
        transformationMatrix.Translate(10, 0);
        circle.RenderTransform = new MatrixTransform(transformationMatrix);
    };

    while(isGoing)
    {
        this.Dispatcher.Invoke(DispatcherPriority.Normal, action);
        Thread.Sleep(50);
    }
}
于 2013-10-28T19:22:03.673 に答える