Exemple #1
0
 private static void LoadBaml(object frameworkElement, Func <Stream> streamFactory, Uri resourceLocator)
 {
     if (_isInitializing)
     {
         InitializationQueue.Enqueue(() => LoadBamlImpl(frameworkElement, streamFactory, resourceLocator));
     }
     else
     {
         LoadBamlImpl(frameworkElement, streamFactory, resourceLocator);
     }
 }
Exemple #2
0
        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;
            }
        }