2016-04-18 9 views
1

ディスク上の一部のデータを読み込んでそれに応じてインターフェイスをカスタマイズする必要があるため、アプリケーションにスプラッシュ画面を表示したいと考えています。私がしなかった場合、インターフェイスが読み込まれてカスタマイズされ、効果がはっきりと見えるようになります。だから、私の考えはグロブラスプラッシュスクリーンウィンドウを定義しています:スプラッシュ画面を正しく表示するには

  1. コンストラクタでは、最後に

    WindowState = WindowState.Minimized; // <---- for the mainWindow 
    splashScreen.Show(); 
    
  2. WindowViewBase_Loadedイベントで

    SetInterfaceElements(); // <-------interface customization (1)  
    splashScreen.Close(); 
    WindowState = WindowState.Maximized; // (2) 
    Activate(); // <------------------------to put focus on 
    

効果はそれほど常に(1)及び(2)の間のギャップと同じです。

私はリフレッシュの問題について考えました。私はUpdateLayoutでそれを強制しようとしましたが、運はありません。だからhereから別の解決策が、常に同じです。私は何かを逃している?

+0

これは、起動スプラッシュスクリーンですか?そのためのテンプレート項目が組み込まれているためです。 –

+0

はい、それはいくつかの制約があります。私のコメントをisrael altarの答えに見てください。 – Luca

答えて

1
MAINVIEWコンストラクタで

public MainView() 
{ 
    SplashScreen splashScreen = new SplashScreen(); 
    splashScreen.Show(); 
    ... 
} 

その後

Action emptyDelegate = delegate { }; 
bool IsContentRendered = false; 
private void WindowViewBase_Loaded(object sender, RoutedEventArgs e) 
{ 
     SetInterfaceElements(); 
     Dispatcher.Invoke(emptyDelegate, DispatcherPriority.Render);<---to refresh 
     IsContentRendered = true; 
} 

ついに

private void WindowViewBase_ContentRendered(object sender, EventArgs e) 
{ 
if (IsContentRendered) 
    { 
     if (splashScreen != null) 
     splashScreen.Close(); 
     WindowState = WindowState.Maximized; 
     Activate(); 
    } 
} 
2

あなたがする必要があることは、スプラッシュスクリーンクラスを作成し、そのすべての機能をカプセル化することです。さらに、あなたはこのように、スレッドによってスプラッシュ画面を有効にする必要があります:あなたのコードは、そのようにすると仮定

public static class SplashScreenView 
{ 
    public static Show() 
    { 
    Thread thread = new Thread(() => 
      { 
       splashScreenView = new SplashScreenView(); 
       .... 
      } 
      // you code 
      thread.Start(); 
    } 

    public static Close() 
    { 
    // close splash screen code 
    } 
} 

後ということ:

SplashScreenView.Show(); 
// all your code 
SplashScreenView.Close(); 

あなたが最大化する必要はありません。この道であり、あなたの窓を最小化する。

+0

これは問題ありませんが、間違っていない場合は、1.インターフェース2をロードする必要があるという問題は解決しません。いくつかの非直列化設定に従ってカスタマイズしてください。スプラッシュスクリーンの目的(および主な縮小)は、そのギャップを隠すことです。 – Luca

+0

@ルカあなたはギャップが何であるかもう一度説明してください、私は質問からそれを理解していない... –

+0

謝罪それをもう一度説明します。操作は次のとおりです。1.標準インターフェースのxamlベースの作成2.データの逆シリアル化(時間がかかります)3.逆シリアル化されたデータに従ってインターフェースをカスタマイズします。だから、もし私が何かをしなければ、最初に私はプログラムが登場するのを見て、それからホップ!...それは脱直列化されたデータに応じて変化します。かなり醜い!! – Luca

1

個人的には、アプリケーションの初期化時にSplashをMainWindowとして設定し、スプラッシュウィンドウのロードコールバックで必要な読み込みを行った後、実際のMainWindowを開いて開きます。そうすれば、スレッド/ UIのフリーズを気にする必要はありません。

関連する問題