2017-04-05 13 views
0

私は数ヶ月前にC#とWPFを使い始めましたが、今はスレッド化のようないくつかの新しいテクニックを学ぼうと思っていました。だから私は常に(無限ループを使用して)実行したいが、毎分ダイアログ(メインウィンドウ)を表示するアプリケーションを持っている。だから私はスレッドを使用してこれを行うと、ここで私はこれをやっている方法です午前:私のcallmyfunctionでWPF用のリセットコントロール

public MainWindow() 
{ 
    InitializeComponent(); 
    while (true) 
    { 
     callmyfunction() 
     system.Threading.Thread.Sleep(1000); 
    } 
} 

()、私は(メインのWPFアプリケーションである)ダイアログを呼び出していますので、それが表示されます。私はそれをやっている方法は次のとおりです:

普通のボタンがあり、それをクリックするとメインウィンドウが隠れるはずです。だから私のボタンの機能は、このようなものです:

private void Button_Click2(object sender, RoutedEventArgs e) 
{ 
    this.Hide(); 
} 

それでは、私がやっていることは、私は通常、メインウィンドウをロードしていますし、それがボタンを持って、私はそのボタンをクリックすると、それがメインウィンドウを非表示とすべきですウィンドウは、thread.sleepで指定されたミリ秒単位でスリープ状態になり、起動すると再びダイアログが表示され、ボタンなどが表示されます。このループはうまく動作しますが、最初のダイアログが表示された後、メインウィンドウを隠すボタンをクリックすると、メインウィンドウが2回目に表示され、ボタンは "押された"ボタンではなく、新しいボタンとして表示されます。メインウィンドウがはじめて表示されたときにそのウィンドウを「押した」ためだと思います。そして、私はプログラムを止めてもう一度それを実行するまでそれを維持します。

私の質問は、どのように私はボタンコントロールを "リセット"できますか?または、マウスクリックイベントをリセットする必要がありますか?これを指すポインタは参考になります。

+0

コンストラクタ内の無限ループは非常に悪い考えです。 –

+0

@sir Rufoどのように来ますか?あなたは詳細を教えていただけますか? –

+0

無限実行コンストラクタからインスタンスを構築することはできません。コンストラクタは最後にインスタンスを返しますが、オープンエンドがあるためにあなたのものはそうではありませんでした。 –

答えて

1

バックグラウンドスレッドでループを実行する必要があります。 UIスレッドで実行すると、アプリケーションはユーザーの入力に応答できなくなります。

バックグラウンドスレッドでいくつかのコードを実行する最も簡単で推奨される方法は、新しいTaskを開始することです。

また、バックグラウンドスレッドからウィンドウにアクセスすることはできないため、ディスパッチャを使用して呼び出しをUIスレッドにマーシャリングする必要があります。

次のサンプルコードは、あなたにその考えを与えるはずです。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Task.Factory.StartNew(() => 
     { 
      while (true) 
      { 
       Dispatcher.Invoke(() => callmyfunction()); 
       System.Threading.Thread.Sleep(5000); 
      } 
     }, TaskCreationOptions.LongRunning); 
    } 

    public void callmyfunction() 
    { 
     WindowState = WindowState.Normal; 
    } 

    private void Button_Click2(object sender, RoutedEventArgs e) 
    { 
     WindowState = WindowState.Minimized; 
    } 
} 
+0

*メインウィンドウを非表示にして、ウィンドウをthread.sleepで指定したミリ秒ごとにスリープ状態にしてから起きるでしょう*タイマーで実現する必要があります –

+0

あなたのポイントは何ですか?私が投稿したサンプルコードは、ボタンがクリックされたときにウィンドウを最小化し、その後ループ内に復元されます。 – mm8

+2

このようなタスクは長期的なものとしてマークする必要があります – VMAtm

関連する問題