private static void LoadBaml(object frameworkElement, Func <Stream> streamFactory, Uri resourceLocator) { if (_isInitializing) { InitializationQueue.Enqueue(() => LoadBamlImpl(frameworkElement, streamFactory, resourceLocator)); } else { LoadBamlImpl(frameworkElement, streamFactory, resourceLocator); } }
private static void LoadBamlImpl(object rootObject, Func <Stream> streamFactory, Uri resourceLocator) { _isInitializing = true; try { using (var stream = streamFactory()) { var uri = new Uri(new Uri("pack://application:,,,", UriKind.Absolute), resourceLocator); var parserContext = new ParserContext { BaseUri = uri }; var xamlReaderType = typeof(XamlReader); var loadBamlMethod = xamlReaderType.GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static); loadBamlMethod.Invoke(null, new object[] { stream, parserContext, rootObject, true }); } } catch (Exception e) { var frameworkElement = rootObject as FrameworkElement; RuntimeUpdateHandler.ClearChildren(frameworkElement); if (frameworkElement != null) { frameworkElement.SetValue(Control.BackgroundProperty, Brushes.Red); } try { if (frameworkElement != null) { frameworkElement.EndInit(); } } catch { } if (e is TargetInvocationException && e.InnerException != null) { Debug.WriteLine("Runtime update failed: " + e.InnerException); MessageBox.Show(e.InnerException.ToString()); } else { Debug.WriteLine("Runtime update failed: " + e); MessageBox.Show(e.ToString()); } } if (InitializationQueue.Count > 0) { var nextInitializer = InitializationQueue.Dequeue(); nextInitializer(); } else { _isInitializing = false; } }