0

現在、C# アプリケーションを開発しています。今、私は単純なスライダーを実現しようとしています:

|--------------------------|
|                          |
|  |--------------------|  |
|  |                    |  |
|  |       Panel1       |  |
|  |       Panel2       |  |
|  |                    |  |
|  |--------------------|  |
|           x x x          |
|--------------------------|

まったく同じサイズの 2 つのパネルがあります。Panel1 は、境界線を表示し、動的に交換される panel2 の境界を設定するために必要です。

2 番目の x をクリックすると、panel2 が左に移動し、panel3 が右から来て、左に移動します。

基本的に私は次のコードを持っています:

Panel panel2 = panelArray[0];
Panel panel3 = panelArray[1];

次のコードでスライドを実行する必要があります。

for (int i = 0; i <= 100; i++)
{
    panel2.Location = new Point(panel2.Location.X - i, panel2.Location.Y);
    System.Threading.Thread.Sleep(10);
}

for (int i = 0; i <= 100; i++)
{
    panel3.Location = new Point(100 - i, panel3.Location.Y);
    System.Threading.Thread.Sleep(10);
}

どういうわけか、最初のパネルは完全にスライドアウトされていますが、パネル 2 はスライドしていません。ループが実行された後に表示されます。

panel2 がスライドを実行していない理由は何ですか? 私はWinFormsを使用しています。

4

2 に答える 2

1

Application.DoEvents場所を変更した後、ループの本体に追加してみてください。UIは追いつくチャンスが必要です。

于 2012-07-26T20:30:15.473 に答える
0

問題は、スリープを強制してメッセージ ポンプの実行を許可していないことです。提案されApplication.DoEventsた方法でメッセージ ポンプがトリガーされますが、コードが依然としてほとんどの場合ブロックされ、このパターンで無限ループで実行される可能性があるため、これは適切な解決策ではありません (たとえば、DoEvents呼び出し元のイベントに再び入る場合)。 .

を使用する代わりにThread.Sleep、 (Winforms) を使用する必要がありますTimer。これにより、UI の更新の問題が解決され、スライダーが移動している間も UI が維持されます。

于 2012-07-26T20:31:38.610 に答える