4

私のアプリケーションでは、特定の画像の明るさとコントラストを制御するために 2 つのスライダーを使用しており、2 つのスライダーのいずれかがその値プロパティを変更するたびに、画像をピクセルごとに完全に再計算する必要があります。小さい画像の再計算は問題なく行われ、問題はありませんが、大きい画像は再計算に時間がかかり、スライダーのつまみはマウス ポインターに比べてわずかに遅れて移動します。画像を多かれ少なかれリアルタイムで再計算する必要があるため、単にイベントをオンDragCompletedまたは同様にすることは受け入れられません。

ValueChanged再計算は、スライダーのイベントを使用して初期化されます。この問題の良い解決策は、イベントができるだけ早く発生せず、少なくとも50ミリ秒待ってから再度発生することだと思いますが、それを制御できるスライダーのプロパティはありますか?

私が考えていた別の解決策は、イベントが処理される開始時にスライダーからイベントを削除し、しばらくしてから再度追加することですが、それ自体が遅延を引き起こす可能性があり、これもここでは好ましくありません。

このトピックについてはどこにも見つけることができなかったので、誰かが私が使用できる良い提案や方向性を持っていれば、私はとてもうれしいです.

4

4 に答える 4

4

ValueChangedイベントがトリガーされるたびにアプリケーションで計算を行う必要がないと思われる場合 は、Thumb コントロールのDragCompletedイベントを使用して、ユーザーがコントロールのドラッグを終了した後の位置を決定できます。

<Slider Thumb.DragCompleted="Slider_DragCompleted_1"  
    Height="27" Margin="132,162,0,0" VerticalAlignment="Top" Width="303"/>

ユーザーがドラッグをやめると、

private void Slider_DragCompleted_1(object sender, DragCompletedEventArgs e)
{
    Slider s = sender as Slider;
    // Your code
    MessageBox.Show(s.Value.ToString());
}

ただし、これはユーザーがスライダーをドラッグしたときにのみ機能することに注意してください。ユーザーがスライダーをクリックしてもトリガーされません。

マウスクリックなどの他のイベントの処理については、これを参照してください。

ある程度の時間遅れで計算したい場合は、タイマーを使用できます。

編集: あなたの要求に基づいて、このようにすることができます。「ValueChanged」イベントで。

 // Start a new thread only if the thread is stopped 
 // or the thread has not been created yet.
 if (threadPopular == null || threadPopular.ThreadState == ThreadState.Stopped)
 {
           threadPopular = new Thread(new ThreadStart(Your function));
           threadPopular.Start();
  }
于 2013-08-29T12:50:44.813 に答える
0

Backgroundworker画像処理がBackgroundworker非同期で行われる場所を使用してこれを実装するかもしれません。

Timerまた、ここで使用して、ティック時間を快適な値に設定することもお勧めします。有効になっていない場合は、sliderchanged イベントごとにタイマーを開始します。タイマー ティック イベント ハンドラーでは、バックグラウンド ワーカーが動作しているかどうかを確認してから、前の操作をキャンセルして新しい操作を実行できます。bacgroundworkerdone イベント ハンドラーで、タイマーを停止するだけです。

ありがとう

于 2013-08-29T12:42:37.697 に答える