2017-11-14 7 views
1

ボタンをクリックすると、テキストブロック内の数字が1つ増えます。 しかし、私は数ミリ秒の待機で増分を表示したい。遅延付きインクリメント番号(C#)

XAML

<TextBlock Name="DisplayTextBlock" FontSize="50" HorizontalAlignment="Center" VerticalAlignment="Top"/> 

<Button Name="CountingButton" Height="80" Width="150" HorizontalAlignment="Center" VerticalAlignment="Bottom" Click="CountingButton_Click"/> 

C#

int i = 0; 

private void CountingButton_Click(object sender, RoutedEventArgs e) 
{    
    do 
    { 
     i++; 

     DisplayTextBlock.Text = i.ToString(); 
    } 
    while(//something is on) 
} 

ので、どのように私は待って追加することができます...

+1

A「数ミリ秒」をユーザーに検出されない –

+0

多くの似たような答えがありますので、あまりにも最初の答えを受け入れることができます。私は答えiamのチェックとしてマークしています。 –

+0

@ArpitJain回答を受け入れる前に、ある時間(24時間?特に既存のものがまったく必要ない場合は特に。 – Fildor

答えて

2

無期限に更新したいと思っているように、私は以前の答えを変更してタイマーを使用しました。私の解決策は、イラストレーションの目的でボタンをクリックして有効状態を切り替えることです。次のことを考えてみましょう:

DispatcherTimer _timer; 

private int i = 0; 

public bool SomethingIsOn { get; private set; } = true; 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (_timer == null && SomethingIsOn) 
    { 
     _timer = new DispatcherTimer() 
     { 
      Interval = TimeSpan.FromMilliseconds(300) 
     }; 
     _timer.Tick += _timer_Tick; 
     _timer.Start(); 
    } 
    else if(_timer != null) 
    { 
     _timer.Stop(); 
     ((Button)sender).IsEnabled = false; 
    } 
} 

private void _timer_Tick(object sender, object e) 
{ 
    if (SomethingIsOn) 
    { 
     i++; 
     DisplayTextBlock.Text = i.ToString(); 
    } 
} 

あなたの適切な解決策では、あなたはそれはそれを複数回クリックしたユーザを避けるために最初にクリックされたときに、ボタンを無効にすることができます。

更新 私は現在、UWPで利用できるDispatcherTimerを使用しています。遅延があまりにも仕事とされていない場合

System.Threading.Thread.Sleep(x); 

await System.Threading.Tasks.Delay(x); 
+0

@Fabulous Heads up:問題のOP変更されたコードスニペット。私はそれがゲームを変えると思う。 – Fildor

+1

@Fildorヘッドアップに感謝します。私は見て、それに応じて自分のコードを変更します – Fabulous

+0

私はこの条件を満たします "私は遅れを追加しているので、その事は頻繁に変化しているのでチェックすることができますか?間違っているのでしょうか?他の方法を使用する必要があります。 " –

6

メソッド宣言にasyncキーワードを追加します。さらにTask.Delayを追加します。

private async void CountingButton_Click(object sender, RoutedEventArgs e) 
{  
    i++; 
    await Task.Delay(200); 
    DisplayTestBlock.Text = i.ToString(); 
} 
+2

@ Pac0イベントハンドラでは、イベントハンドラの戻り値やシグネチャを変更できないため、 'async void'を使用することができます。 – Fabulous

+0

エラー遅延がネームスペースsystem.threding.taskに存在しないことを示します。 –

+1

@ArpitJain、 'Task'は' System.Threading.Tasks'名前空間内のクラスです。現在のファイルの最初の行として追加します。 'System.Threading.Tasks'を使用するか、テキストエディタでエラーをクリックしてCTRL +を押してください。 –

-1

私はあなたが探しているものだと思う

は睡眠です。何ミリ秒も遅れてしまい、UIを長時間ブロックすることになります。おそらくタイマーについて学ぶ必要があります。
+1

この 'Thread.Sleep(x)'はジョブを実行しますが、スリープ中に実際にスレッドをブロックするので、 'await Tasks.Delay(x)'を使う方が良いでしょう。 –

関連する問題