none
WPFのリボンタブをクリックしたときの表示レスポンスについて RRS feed

  • 質問

  • お世話になります。

    WindowsForm上にWPFのUserControlを配置した画面を開発しています。
    上記UserControl内にRibbonを配置しています。

    Ribbon内に複数のタブを用意しているのですが、

    配置しているコントロールが多いタブについて、
    表示レスポンスが若干遅い(2~3秒程度)です。

    一度表示すると、2回目以降はすぐ表示されるようですが、

    できれば一度目も表示レスポンスを早くしたいと思っています。

    バックグラウンドで事前にリボンタブ内のコントロールを読み込んでおく等

    対策はあるでしょうか。

    よろしくお願いいたします。

    開発環境:Visual Studio 2013

    プロジェクト:WindowsFormアプリケーション

    言語:C#

    2016年5月26日 10:25

すべての返信

  • 以下が参考になるかもしれません。

    WPFで起動時にウィンドウで使用されるライブラリをロードしたい
    https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/6d23e66f-d0cb-4ef6-b787-72b7faf91007/wpf?forum=csharpgeneralja


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年5月27日 1:43
    モデレータ
  • 以下が参考になるかもしれません。

    WPFで起動時にウィンドウで使用されるライブラリをロードしたい
    https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/6d23e66f-d0cb-4ef6-b787-72b7faf91007/wpf?forum=csharpgeneralja


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    リンク先でも議論がありますが、最適化の対象になるコードに注意。

    具体的には、

    var typeLoader = typeof(SomeType);

    とかやると、Debug版では目的の動作になりますが、Release版では最適化されて、読み込まれないという話になります。

    private bool assemblyLoaded = false; pubic UserControl1() { if (!assemblyLoaded) LoadAssembly(); InitializeComponent(); } public void LoadAssembly() { assemblyLoaded = typeof(SomeType1) != null && typeof(SomeType2) != null;

    MyLibrary.LoadAssembly(); }

    とかやって、参照先にも呼び出し元にもLoadAssembly()を実装して、芋づる式にロードしてやると、いいです。


    2016年5月27日 14:32
  • WindowsForm上にWPFのUserControlを配置した画面を開発しています。

    上記UserControl内にRibbonを配置しています。

    とありますが、XAMLでしか参照されないGACにインストールされていないアセンブリがある場合は、パフォーマンス云々に関わらず、そのアセンブリの型をUserControlのInitializeComponent()の前で参照(typeof)するのを忘れないでください。

    例えば、System.Windows.Interactivity.dllをXAMLでしか使用しなかったときに、Windows Formsのデザイナやテストコンテナで、XamlParseExceptionが発生する可能性があります。

    XAMLでしか参照されないアセンブリは、Windows Formsデザイナやテストコンテナのexeがあるフォルダにおいてあると判断されるようで、XAMLを読み込む前にロードしておく必要があります。


    2016年5月27日 15:57
  • アプリケーションの起動時間

    にありますが、スプラッシュウィンドウを表示するときなどの、起動シーケンスの中で、早く起動したいコントロールのアセンブリや、関連するFrameworkアセンブリをロードするといいです。

    デバッガのログを見れば、コントロールのインスタンス作成時に読み込まれるアセンブリは特定できるので、サンプルに上げたLoadAssembly()中で、アセンブリの型を参照してやります。

    もっとも、すべてのアセンブリをロードしても、WPFの初期化処理(約100MBの仮想メモリを予約、云々)などで、最初のWPFコントロールの初期化にはコストがかかります。

    試せていませんが、初期化による遅延を回避するためには、スプラッシュウィンドウなどに、WPFの単純なコントロールを仕込み、そこでLoadAssembly()を呼び出すというやり方が確実だと思います。


    • 編集済み tmori3y2 2016年5月31日 15:41
    2016年5月31日 15:40