2016-07-25 2 views
0

後、私は、テキストファイル内の値を修正するプログラムを書いています。私のxamlにはステータス/進行状況を報告するはずのテキストボックスがあります。 "waiting" =プログラムが始まる前に、 "processing" =プログラムがファイルを処理しています。 "done" =ファイルが処理されました。ここで変更するテキストは、再度、ランタイム

は私のテキストフィールドのXAMLコードとRUNボタンです:

を私は、このさまざまな方法を試してみました:

<TextBox x:Name="statusBox" HorizontalAlignment="Left" Height="23" Margin="130,332,0,0" TextWrapping="Wrap" Text="waiting" VerticalAlignment="Top" Width="120" FontSize="14" TextAlignment="Center" IsReadOnlyCaretVisible="True" > 
<Button Content="Run" 
      Name="Run" 
      HorizontalAlignment="Left" 
      Margin="562,27,0,0" 
      VerticalAlignment="Top" 
      Width="53" 
      Click="Run_Click" 
      RenderTransformOrigin="-0.305,0.487" Height="19"> 
     <Button.BindingGroup> 
      <BindingGroup Name="btnOpen"/> 
     </Button.BindingGroup> 
     <Button.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform/> 
       <SkewTransform/> 
       <RotateTransform Angle="-0.848"/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Button.RenderTransform> 
    </Button> 

ここで私が午前の問題があります。私が下にあるのは、最新の試みです。

//In XAML, the status defaults to "waiting". 
public class Operate 
{ 
public void operations() 
{ 
statusBox.Text = "processing"; 
... Perform Text Operations 
status.Text = "finished"; 
} 
}  

プログラムを実行すると、ステータステキストボックスに「待機中」が表示されます。しかし、[実行]をクリックするとプログラムが始まりますが、テキストには「待機中」と表示されます。そして、プログラムの実行が終了すると、その間に「処理中」に変化することなく、テキストが「終了」に変わります。

ご協力いただきまして誠にありがとうございます。私は多くのコンソールアプリケーションをプログラミングしましたが、wpfには比較的新しいです。

ありがとうございました。

+0

私は、これは単なる誤植が、 'statusBox.Text'なく' status.Text'だと思います。とにかく、すべてを削除して 'statusBox.Text =" processing ";を' keep 'すると変更されますか? –

+1

長い操作で作業するには、 'ThreadPool'を使う必要があります。ここに例があります:http://stackoverflow.com/questions/36521365/run-program-after-wpf-windows-form-appears –

+1

これについては実際には100の方法がありますが、最も良いのはASYNCとバインディング。 WPF/XAMLでバインディングを開始する方法を学ぶと、それは長い道のりになります。 –

答えて

1

問題は、すべてのコードが同じスレッド上で実行されていることであると述べています。あなたの操作はUIスレッド上で実行されています。つまり、実行しようとしているような変更には対応できません。

これを回避する方法は、新しいスレッド上にあなたの仕事を移動しています。

(これは、非同期/のawait構文サポートされている.NET Frameworkの新しいバージョンを想定して)

public class Operate 
{ 
public async void operations() 
{ 
statusBox.Text = "processing"; 

await Task.Run(()=>{ 
//do work here 
}); 

status.Text = "finished"; 
} 
} 

そのTask.Runコマンドが別のスレッドで実行されるので、それがUIにアクセスすることができないことに注意してください。

:あなたはUIに表示するために何かを返す必要があるなら、あなたはこれを行うことができ

await Task.Run(mydata=>{ 
//do stuff, with mydata variable 
}); 

:あなたはそれがUIからいくつかの情報を持っている必要がある場合は、そのようなTask.Runコールでそれを渡すことができます

var myReturnValue = await Task.Run(mydata=>{ 
    //do work 
    return myNewReturnData; 
}); 

//can do something with your return data here. 

ユーザーがトランザクションをキャンセルするために別のボタンをクリックする必要がある場合は、CancellationTokenクラスを参照してください。

2

、実行して起動すると、それは現在のスレッドを実行し終了するまで、あなたのUIは更新されません。 タスクを完了すると、ステータスが処理から完了まで非常に高速に更新されるので、変更は表示されません。 バックグラウンドワーカーを使用してより長い操作を実行し、UIを操作可能にすることをお勧めします。

はこのHOWTOを参照してください:Use a background worker

2

あなたはBackgroundWorkerを使用してに見てみたいことがあります。リクエストの処理中にUIがブロックされているようです。他の人のよう

MSDN BackgroundWorker Class

関連する問題