1

こんにちは仲間のプログラマー、

データバインドされたデータグリッドなどを使用して、かなり複雑なWPFアプリケーションを作成しました。コンテンツは動的に変更されるため、ウィンドウ自体もサイズ変更されます(想定どおり)。次のように、サイズが変更されたときにウィンドウをプライマリ画面の中央に揃える関数を作成しました。

this.SizeChanged += delegate
   {
       double screenWidth = SystemParameters.PrimaryScreenWidth;
       double screenHeight = SystemParameters.PrimaryScreenHeight;
       double windowWidth = this.Width;
       double windowHeight = this.Height;
       this.Left = ( screenWidth / 2 ) - ( windowWidth / 2 );
       this.Top = ( screenHeight / 2 ) - ( windowHeight / 2 );
   };

それは私が思ったように機能します。ただし、コンテンツはデータにバインドされているため、コンテンツが利用可能になるまでに約1/4秒かかります。上記のSizeChangedイベントは、その時点ですでにその役割を果たしているため、ウィンドウはまったく中央に配置されていません。

すべてをロックせずに、イベントがトリガーされる前に何らかのタイムアウトを実装できますか?

辛抱強くお返事をお待ちしております!

4

1 に答える 1

4

推測ですが、これらの1つが機能する可能性があります

  this.SizeChanged += delegate
  {
      Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)delegate()
      {
          double screenWidth = SystemParameters.PrimaryScreenWidth;
          double screenHeight = SystemParameters.PrimaryScreenHeight;
          double windowWidth = this.Width;
          double windowHeight = this.Height;
          this.Left = (screenWidth / 2) - (windowWidth / 2);
          this.Top = (screenHeight / 2) - (windowHeight / 2);
      });
  };


  this.SizeChanged += delegate
  {
      ThreadPool.QueueUserWorkItem((o) =>
      {
          Thread.Sleep(100); //delay (ms)
          Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate()
          {
              double screenWidth = SystemParameters.PrimaryScreenWidth;
              double screenHeight = SystemParameters.PrimaryScreenHeight;
              double windowWidth = this.Width;
              double windowHeight = this.Height;
              this.Left = (screenWidth / 2) - (windowWidth / 2);
              this.Top = (screenHeight / 2) - (windowHeight / 2);
          });
      });
  };

私が言ったように、データのロード遅延を複製するためのセットアップがないので、推測です

于 2012-12-03T09:45:42.880 に答える