2

わかりましたので、私は C#/.NET を学んでおり、これまで winforms に固執してきましたが、WPF はこのプロジェクトに適しているようです。

画像の配列を表示する WrapPanel があります。時々、この配列はウィンドウの範囲を超えてあふれます。タイマーを使用してすべての画像が表示されるまで、「ページ」を循環しようとしています。

タイマー経過イベントでコード サンプルを開始します。この時点で、WrapPanel (wrapPanel1) は既に設定されており、オーバーフローがあるかどうかを確認しています。

public void t2_Elapsed(object source, ElapsedEventArgs e)
    {

        wrapPanel1.Dispatcher.BeginInvoke((ThreadStart)delegate 
        {
            remaining = Convert.ToInt32(imgCount) - (iteration*xDensity);

            label1.Content = iteration;
            label2.Content = remaining;
            label3.Content = imgCount;

            if (remaining <= 1)
            {
                Thickness marginTop = wrapPanel1.Margin;
                marginTop.Top = 0;
                wrapPanel1.Margin = marginTop;
                wrapPanel1.Children.Clear();
                t2.Stop();
                imgLayout();
            }

            else
            {
                Thickness marginTop = wrapPanel1.Margin;
                marginTop.Top = -((prevResY+10) * iteration);
                wrapPanel1.Margin = marginTop;
                iteration++;
            }
        });
    }

imgCount は、WrapPanel 内の画像の総数を示す double です (コード内の別の場所で別の double と相互作用するため、double である必要があります)。

xDensity は、水平方向に表示される画像の数を設定するユーザー定義の int です。

prevResY は各写真の高さ (すべて同じ解像度) です。WrapPanel が設定されたときに設定される 5px の余白を考慮して 10 を追加します。繰り返しを掛けることで、wrapPanel1 を常に 1 行上に移動します。

imgLayout(); すべてのページを実行するたびに、新しい画像があるかどうかを確認し、古い画像を最後からノックアウトする必要があるため、プロセスを最初からやり直します。これはすべて imgLayout() で処理されます。

デバッグ中にラベルを監視できるようにラベルを更新すると、期待どおりの値が返されます。

質問のタイトルからお気づきかもしれませんが、私の問題は、t2_elapsed を繰り返すたびに間隔が長くなるように見えることです。その動作を観察するためだけに間隔を 10 ミリ秒に設定すると、遅延が指数関数的に増加するように見えます。30 秒後の遅延は約 25 秒で、最初に観測された 0.1 秒から増加しています。RAM の使用量もゆっくりと上昇します。これは、ループの再起動時に一部のリソースが破棄されていないことを示唆しています。それが原因なのか、それとも別の問題なのかはわかりません。

誰かが助けてくれることを願っています! 私が何かばかげたことをしたら、教えてください、私はまだ学んでいます!

どうもありがとう

- - アップデート - -

わかりましたので、それは

wrapPanel1.Children.Clear(); 

ライン。私はそれを削除し、それをいっぱいにして、遅延は発生しませんでしたが、これは明らかに最終的な解決策ではありません. その行をどこに置いても、問題が再現されます。

----更新2 ----

ええと、私は今かなりばかげていると感じています。以前、タイマーが開始される imgLayout() メソッドで使用していました。

t2.Interval = new TimeSpan(0, 0, 0, 0, 5000);
t2.Tick += new EventHandler(t2_Tick);
t2.Start();

ループが再起動するたびに、愚かにもイベント ハンドラーを宣言していました。代わりに Window_Loaded メソッドで設定したところ、期待どおりに機能し、少し整理して、1 行だけではなく一度に 1 ページ全体をスクロールする方法を実装しました。

4

1 に答える 1

4

WPF で繰り返し操作を処理する場合は、 System.Windows.Threading.DispatcherTimerを使用することをお勧めします。を必要とせずにディスパススレッドでコードを自動的に実行しますBeginInvoke

于 2012-06-15T11:38:07.770 に答える