1

ContentPanel私の Windows Phone 7 アプリでは、指定した時間 (この場合は 3 秒) 内に の背景の色を変更したいと考えています。基本的には「点滅」したいです。

しかし、問題は、ループが機能している間は変更が表示されず、ループが機能した後、色が一度だけ変化することです。なんで?

byte R;
TimeSpan ts = new System.TimeSpan(0, 0, 0, 3);
DateTime dt1 = new DateTime();           
DateTime dt2 = new DateTime();    

requirement = true;
while (requirement)
{ 
    R = Convert.ToByte(0.5 * 255 * (1 + Math.Sin(DateTime.Now.Millisecond)));
    ContentPanel.Background = new SolidColorBrush(Color.FromArgb(255, R, 125, 70));
    dt1 = DateTime.Now;
    dt2 = DateTime.Now;
    dt2.Subtract(dt1);
    if (dt2.Subtract(ts).CompareTo(dt1) > 0) requirement = false;
 }

それは可能ですか?

4

3 に答える 3

1

ループがきつすぎるようです。

代わりにこれを試してください:

private DispatcherTimer _timer;

private void StartFlash()
{
  _timer = new DispatcherTimer();
  _timer.Interval = new TimeSpan(0,0,1);
  _timer.Tick += (s,e) => ChangeColour;
}

private void StopFlash()
{
  _timer = null;
}

private void ChangeColour() {
  // Your colour changing logic goes here
  ContentPanel.Background = new SolidColorBrush(Color.FromArgb(a,r,g,b));
}

そのコードをクラスに入れます。どこかでStartFlash()を呼び出します。ChangeColourは毎秒実行されます。

于 2013-01-25T16:18:47.820 に答える
0

DispatcherTimerを使用して非同期で実行してみてください。

さらに、UIスレッドで作業している場合、メソッドの実行中にUIは更新されません。

于 2013-01-25T16:19:10.677 に答える
0

DateTime.Now を求めているのは速すぎるため、DateTime の精度がナノ秒に達しないため、差は 0 になります (日付は結局、UNIX エポックからミリ秒単位でマークされます)。

より堅実なロジックで while を制限したい場合があります。

于 2013-01-25T16:15:34.460 に答える