2015-12-17 21 views
5

私のUWPアプリの開発中、私は気づいていて奇妙なことを説明しています。UWPアプリのMerge ResourceDictionaryの初期化

IユーザーMvvmLight及びIはApp.xamlMergedDictionariesから参照する別のResourceDictionary Core.xamlにViewModelLocatorリソースインスタンスを追加することを決定しました。続き はApp.xamlの内容です:Core.xaml

<Application ...> 
<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources/Core.xaml" /> 
      <ResourceDictionary Source="Resources/Converters.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
</Application> 

内容:

<ResourceDictionary ...> 
    <viewModel:ViewModelLocator x:Key="Locator" /> 
</ResourceDictionary> 

今、私はCore.xaml内のリソースがInitializeComponent時に初期化されているはずメソッド呼び出しをApp.xaml.csで呼び出しましたが、ServiceLocatorクラス(ViewModeのコンストラクタで設定されています)を使用しようとしましたが、このように - - - ServiceLocator.Current.GetInstance<INavigationService>().Navigate<MainViewModel>(); MvvmLightでlLocator)私が言った例外を取得:

An exception of type 'System.InvalidOperationException' occurred in 
Microsoft.Practices.ServiceLocation.dll but was not handled in user code 

Additional information: ServiceLocationProvider must be set. 

確かに私はViewModelLocatorのコンストラクタにブレークポイントを置いた場合のウィンドウがアクティブになる前に、それは呼び出されません。さらに興味深いことに、ロケータリソースキーを手作業で参照すると(例えば、Debug.WriteLine(Resources["Locator"]);ServiceLocatorの呼び出しの上に置く)、すべて正常に動作します。同じように、ViewModelLocatorリソースをApp.xamlに直接移動すると、IntializeComponentの間にインスタンス化されます。

UWPアプリケーションにマージされたリソースディクショナリの遅延インスタンス化はありますか?それとも、なぜこのように振舞うのでしょうか?

+1

この奇妙な動作は、ResourceDictionaryにいくつかの通常の(スタイルではない)オブジェクトがある場合に発生することがわかりました。 1つのViewModelLocatorだけが完全に動作し、ctorが呼び出されていること。私の発見http://stackoverflow.com/questions/34466035/uwp-resourcedictionary-is-not-being-loaded-when-i-add-a-second-object-to-it –

答えて

6

UWPのResourceDictionaryにはコードがありません(InitializeComponent)。したがって、ResourceDictionaryで定義されたクラス参照は直接初期化されません。

App.InitializeComponentもこれを行いません。 UWPのリソース辞書は、この機能を提供していません。理由を聞かないでください。

ResourceDictionaryDataTemplateを初期化して簡単に試すことができます。
これは悲しいことですが、うまくいきません。

しかし、コードの背後でResources["Locator"]アクセス権を使用すると、クラスのコンストラクタがトリガされ、正常です。

これは解決策ではなく、問題の説明です。 私はそれがあなたを助けてくれることを願っています。

+0

説明ありがとう!この問題を回避する方法の1つは、{x:Bind}を含む辞書と同様に、辞書のコードビハインドクラスを追加することです。しかし、これはViewModelLocatorを手動でインスタンス化するほうが良いと思います。これは、これが唯一のリソースであるため、ロード時にメモリを節約できます。 –

+0

@MZetko非常に中心的なものなら、代わりに 'App.xaml''の' Resources'セクションで初期化するかもしれません。 – Herdo