私は、スクロール可能な多くのオブジェクトを持つ大きなキャンバスを持っています。 私はクリックしてドラッグすることができるオブジェクトを画面に置いています(たとえば、テキストボックス)。オブジェクトはマウスをキャプチャするだけで、Canvas.SetLeft()とSetTop()をOnMouseMovedイベントとして呼び出すことが呼び出されます。多くのオブジェクトを持つ大きなキャンバスでパフォーマンスを引き出す
これは小さなキャンバスでうまくいきますが、数千のオブジェクトを持つこの非常に大きなオブジェクトは、ドラッグされたオブジェクトを非常にゆっくりとリフレッシュします。あまりユーザーフレンドリーではありません。
私はこの購入を改善する必要がありますどのように進歩するか分からない。
私が持っていた考えの1つは、現在のウィンドウサイズのみで子どもを含んでいない透明なキャンバスを前景にしておきます。ドラッグを開始するときは、完了するまでこのレイヤーに移動し、大きなレイヤーに戻します。しかし、もう1つのハックのための努力がたくさんあります...
更新:パーフォレータを使用して、私はこのオブジェクトをドラッグしている間、キャンバスが繰り返し実行されるレイアウトパスを取得しているのを見て、これは遅い部分です。これを回避する方法があるかどうかが分かります...
何らかの仮想化が役立つでしょう。しかし、http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspxは、可動アイテムには直接適用されないかもしれません。 –
@ H.B .:移動されたアイテムが(仮想化に関係なく)常に描画されている限り、問題なく適用されます。遅いリフレッシュはおそらく、キャンバスが見えるものの代わりにその子供の* all *を繰り返しレイアウトすることです。後者のみを行う場合は、大きなパーフォーマンスが必要です。 –
私は確かにキャンバスにこのようなもののためのビルトイン(オプション?)バーチャライザーを持っていて欲しいと思います...過去に仮想化されたキャンバスを使用しようとするとヒットしましたが、もう一度試してみてください。アー。 –