1

私のフォームでは、小さなメディア プレーヤーがあります。これは非常に基本的なもので、ネスト、前、再生、停止、音量の増加、トラック バーなどの基本的な機能を備えています。このコードでトラックバーをドラッグして曲を探すことができました:: (トラックバーの最大値がサウンドファイルの合計秒数であると仮定します)

private void SeekBar_Scroll(object sender, EventArgs e)
{
   Player.Position = TimeSpan.FromSeconds(SeekBar.Value);
} 

しかし、音楽が再生されているときにバーを自力で前進させることはできませんでした..私はこのアイデアを思いつきました:

90 秒の曲があるとします。現在、トラック バーの最大値は 100 なので: 100 --> 90 1 --> X X = 0.9 秒 これは、バーの目盛りとトラック バーの値が目盛りごとに増加する値の間の間隔です。これが私のコードです:

while (SeekBar.Value < 100)
{
  System.Windows.Duration duration = Player.NaturalDuration;
  SeekBar.Value += duration.TimeSpan.Seconds / 100;
  Thread.Sleep(duration.TimeSpan.Seconds * 10);
}

これは別のスレッドで実行する必要があると思いますよね?しかし、問題は、それを行うと、トラックバーが作成されたスレッド以外のスレッドで使用されているという迷惑なメッセージが表示される..どうすればそれを回避できますか?

MouseLeaveこのコードをとイベントの両方に入れたかったMouseEnterのですが、同じスレッド上にあり、アプリがフリーズするため、意味がありません..

バーを自分で動かすにはどうすればよいですか?

4

2 に答える 2

3

間隔または 1,000 ミリ秒でWinFormsTimerを作成し、そのTickイベントでトラックバーを更新する必要があります。

于 2012-08-01T14:08:58.293 に答える
2

最も困難な部分 (スクロール バーの長さをオーディオ ファイルの長さにマッピングする作業) が完了したようです。残りは簡単です。

でこれに取り組むことができますTimer。間隔を何らかの値 (1000 ミリ秒または 500 ミリ秒など) に設定し、 でTickスクロールバーを更新します ( を呼び出しますSeekBar_Scroll)。正確な間隔については、何が最も自然に見えるかをテストして確認してください。

アプリケーションの残りの部分をロックすることは言うまでもなく、while ループはおそらく不要な CPU を消費します。

コントロールの更新を回避するには、この SO questionを確認する必要があります。その場合はcontrol.InvokeRequired、メソッドを介して確認して設定する必要があります。Invoke

于 2012-08-01T14:09:24.717 に答える