0

配列を更新するバックグラウンド スレッドがあります。一定の間隔で、myDataGrid.Items.Refresh() を呼び出します。しかし、画面は何も変わりません。しかし、たとえば、画面上のデータ グリッドの列見出しをクリックすると、情報がすぐに実現されます。

画面上の変化を一定の間隔で、たとえば 2 秒ごとに見るのが好きです。私は何が欠けていますか?

状況を示す F# のコード フラグメントを次に示します。

...

勝ちましょう = new Window()
let grid = DataGrid()
grid.HeadersVisibility <- DataGridHeadersVisibility.All
grid.ItemsSource <- myArray
win.Content <- new ScrollViewer(Content=grid)
win.Show()
...
// バックグラウンド スレッド A
// myArray の更新

...

// バックグラウンド スレッド B
let updateDataGrid =
  grid.Items.Refresh()
  Thread.Sleep(5000)
  updateDataGrid

...

[<STAThread>]
行う
  let app = new Application()
  app.Run() |> 無視
4

3 に答える 3

1

DispatcherTimer を試しましたか? (以下のコードは C# です)

timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer1_Tick;

Thread.Sleep の使用を防止します。

于 2009-07-12T14:22:19.677 に答える
0

すでに WPF を使用しているため、その配列を ObservableCollection に変換することは可能ですか? 最後に聞いたのは、DataGrids がそれをサポートしていることです。コレクション内のオブジェクトが既に DependencyObjects である場合、それらの DependencyProperties はグリッドで自動的に更新されます。そうでない場合は、コレクションに手動で再挿入できます。

于 2009-07-13T00:14:18.470 に答える
0

コメントで書式設定を使用できないため、ここで私の応答です。

次のように書くと、タイマーは実際に機能します。

[<STAThread>]
行う
  let app = new Application()
  let timer = new DispatcherTimer()
  timer.Interval <- TimeSpan.FromSeconds(2.)
  timer.Tick.Add (fun _ -> grid.Items.Refresh())
  タイマー.開始()
  app.Run() |> 無視

しかし、今では問題はほぼ逆転しており、ソートする列見出しのいずれかをクリックするまで自動的に更新されます。その後、更新はありません。

ただし、このトリックを実行すると:

  timer.Tick.Add (楽しい _ ->
                    grid.ItemsSource <- null
                    grid.ItemsSource <- myArray
                    grid.Items.Refresh())

正常に更新されますが、並べ替え順序が失われます。

ソート順を維持するには?配列は簡単にソートできますが、ユーザーが自分でソートすることも好きです。

于 2009-07-12T14:51:29.833 に答える