0

複合アプリケーション ブロック (「プリズム」) V2 を使用して wpf アプリを構築していますが、モジュールによって注入されたユーザー コントロールのレンダリングが非常に遅いという問題があります。ユーザー コントロールには、約 2000 行のデータグリッドが含まれており、画面へのコントロールのレンダリングにかなりの遅延があります。最初は、遅いのは wpf ツールキットのデータグリッド コントロール自体が原因だと思っていましたが、そうではありません。データグリッド (TestControl) を含むコントロールを外部モジュールからシェル プロジェクトに移動し、そこから直接ロードすると、コントロールは問題なくすぐにレンダリングされます。

モジュールの IModule の実装で次のコードを使用して、wpf ユーザー コントロールをシェルに挿入します。

 this.regionManager.RegisterViewWithRegion("mainRegion", typeof(TestControl));

Prism アプリで他のモジュールからコントロールを読み込むときにパフォーマンスの問題はありますか? それらをロードする最も最適な方法は何ですか?

ありがとう

4

2 に答える 2

1

ここでの問題は、UI がバックグラウンド スレッドからディスパッチャーを介して更新されているときに、wpf の更新が遅いことのようです。私は codeplex で会話を取り上げ、多かれ少なかれ整理しました。

http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=64113

于 2009-08-25T20:44:01.403 に答える
1

これは、ライフサイクル イベントのアーティファクトである可能性があります。モジュールのロードと登録が開始される前に、シェルが表示されます。これを行うと、モジュールの初期化コードが起動するまで、UI に大きな穴が開いて表示されるため、時間がかかるように「見える」ようになります。

多くのサンプルでは、​​「Shell.Show();」のようなことをしています。ただし、シェルへの参照をブートストラップ クラスのプライベート メンバーに移動し、次のように .Show() を呼び出すことを検討することもできます。

public class Bootstrapper : UnityBootstrapper
{
    Shell shell;
    protected override DependencyObject CreateShell()
    {
        shell = Container.Resolve<Shell>();
        return shell;
    }

    protected override void InitializeModules()
    {
        base.InitializeModules();
        shell.Show();

    }

今これを試してみたところ、確実にアプリのパフォーマンスが向上したように感じたので、自分でこの変更を加えようと思います。

モジュールの読み込みに非常に長い時間がかかる場合は、CreateShell の間と InitializeModules の後にスプラッシュ スクリーンを表示することもできます。

于 2009-07-29T18:04:16.697 に答える