// Token: 0x0600872D RID: 34605 RVA: 0x0024F0F8 File Offset: 0x0024D2F8
            internal override bool BuildVisualTree(FrameworkElement container)
            {
                bool flag = EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

                if (flag)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "ContentPresenter.BuildVisualTree");
                }
                bool result;

                try
                {
                    ContentPresenter contentPresenter = (ContentPresenter)container;
                    Visual           visual           = this.DefaultExpansion(contentPresenter.Content, contentPresenter);
                    result = (visual != null);
                }
                finally
                {
                    if (flag)
                    {
                        EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, string.Format(CultureInfo.InvariantCulture, "ContentPresenter.BuildVisualTree for CP {0}", new object[]
                        {
                            container.GetHashCode()
                        }));
                    }
                }
                return(result);
            }
Beispiel #2
0
        /// <summary>
        /// </summary>
        protected override Size MeasureOverride(Size constraint)
        {
            Size desiredSize       = new Size();
            bool etwTracingEnabled = IsScrollClient && EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

            if (etwTracingEnabled)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:MeasureOverride");
            }
            try
            {
                int count = this.VisualChildrenCount;


                if (count > 0)
                {
                    // The AdornerLayer is always the size of our surface, and does not contribute to our own size.
                    _adornerLayer.Measure(constraint);

                    if (!IsScrollClient)
                    {
                        desiredSize = base.MeasureOverride(constraint);
                    }
                    else
                    {
                        Size childConstraint = constraint;

                        if (_scrollData._canHorizontallyScroll)
                        {
                            childConstraint.Width = Double.PositiveInfinity;
                        }
                        if (_scrollData._canVerticallyScroll)
                        {
                            childConstraint.Height = Double.PositiveInfinity;
                        }

                        desiredSize = base.MeasureOverride(childConstraint);
                    }
                }

                // If we're handling scrolling (as the physical scrolling client, validate properties.
                if (IsScrollClient)
                {
                    VerifyScrollData(constraint, desiredSize);
                }

                desiredSize.Width  = Math.Min(constraint.Width, desiredSize.Width);
                desiredSize.Height = Math.Min(constraint.Height, desiredSize.Height);
            }
            finally
            {
                if (etwTracingEnabled)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:MeasureOverride");
                }
            }
            return(desiredSize);
        }
        public override ObjectHandle CreateInstance(ActivationContext actCtx)
        {
            if (EventTrace.IsEnabled(EventTrace.Keyword.KeywordHosting | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Verbose))
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WpfHost_ApplicationActivatorCreateInstanceStart,
                                                    EventTrace.Keyword.KeywordHosting | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Verbose,
                                                    PresentationAppDomainManager.ActivationUri != null ? PresentationAppDomainManager.ActivationUri.ToString() : string.Empty);
            }

            ObjectHandle oh;

            if (PresentationAppDomainManager.ActivationUri != null)
            {
                oh = base.CreateInstance(
                    actCtx,
                    new string[] {
                    BindUriHelper.UriToString(PresentationAppDomainManager.ActivationUri),
                    PresentationAppDomainManager.IsDebug.ToString(),
                    (PresentationAppDomainManager.DebugSecurityZoneURL == null?
                     string.Empty
                        : PresentationAppDomainManager.DebugSecurityZoneURL.ToString())
                });
            }
            else
            {
                oh = base.CreateInstance(actCtx);
            }
            bool returnAppDomain = false;

            try
            {
                new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert(); // BlessedAssert:
                if (AppDomain.CurrentDomain.ActivationContext != null &&
                    AppDomain.CurrentDomain.ActivationContext.Identity.ToString().Equals(actCtx.Identity.ToString()))
                {
                    returnAppDomain = true;
                }
            }
            finally
            {
                CodeAccessPermission.RevertAssert();
            }

            EventTrace.EasyTraceEvent(EventTrace.Keyword.KeywordHosting | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Verbose, EventTrace.Event.WpfHost_ApplicationActivatorCreateInstanceEnd);

            if (returnAppDomain)
            {
                // This is the new AppDomain. What we return here becomes the return value of
                // InPlaceHostingManager.Execute().
                return(new ObjectHandle(AppDomain.CurrentDomain));
            }
            else
            {
                return(oh);
            }
        }
Beispiel #4
0
        /// <summary>
        /// </summary>
        protected override Size ArrangeOverride(Size arrangeSize)
        {
            bool etwTracingEnabled = IsScrollClient && EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

            if (etwTracingEnabled)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:ArrangeOverride");
            }
            try
            {
                int count = this.VisualChildrenCount;


                // Verifies IScrollInfo properties & invalidates ScrollViewer if necessary.
                if (IsScrollClient)
                {
                    VerifyScrollData(arrangeSize, _scrollData._extent);
                }

                if (count > 0)
                {
                    _adornerLayer.Arrange(new Rect(arrangeSize));

                    UIElement child = this.GetVisualChild(0) as UIElement;
                    if (child != null)
                    {
                        Rect childRect = new Rect(child.DesiredSize);

                        if (IsScrollClient)
                        {
                            childRect.X = -HorizontalOffset;
                            childRect.Y = -VerticalOffset;
                        }

                        //this is needed to stretch the child to arrange space,
                        childRect.Width  = Math.Max(childRect.Width, arrangeSize.Width);
                        childRect.Height = Math.Max(childRect.Height, arrangeSize.Height);

                        child.Arrange(childRect);
                    }
                }
            }
            finally
            {
                if (etwTracingEnabled)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:ArrangeOverride");
                }
            }
            return(arrangeSize);
        }
Beispiel #5
0
        // Token: 0x06005456 RID: 21590 RVA: 0x00175698 File Offset: 0x00173898
        protected override Size MeasureOverride(Size constraint)
        {
            Size size = default(Size);
            bool flag = this.IsScrollClient && EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

            if (flag)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:MeasureOverride");
            }
            try
            {
                int visualChildrenCount = this.VisualChildrenCount;
                if (visualChildrenCount > 0)
                {
                    this._adornerLayer.Measure(constraint);
                    if (!this.IsScrollClient)
                    {
                        size = base.MeasureOverride(constraint);
                    }
                    else
                    {
                        Size constraint2 = constraint;
                        if (this._scrollData._canHorizontallyScroll)
                        {
                            constraint2.Width = double.PositiveInfinity;
                        }
                        if (this._scrollData._canVerticallyScroll)
                        {
                            constraint2.Height = double.PositiveInfinity;
                        }
                        size = base.MeasureOverride(constraint2);
                    }
                }
                if (this.IsScrollClient)
                {
                    this.VerifyScrollData(constraint, size);
                }
                size.Width  = Math.Min(constraint.Width, size.Width);
                size.Height = Math.Min(constraint.Height, size.Height);
            }
            finally
            {
                if (flag)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:MeasureOverride");
                }
            }
            return(size);
        }
        public override ObjectHandle CreateInstance(ActivationContext actCtx)
        {
            if (EventTrace.IsEnabled(EventTrace.Keyword.KeywordPerf | EventTrace.Keyword.KeywordHosting, EventTrace.Level.Verbose))
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WpfHost_ApplicationActivatorCreateInstanceStart, EventTrace.Keyword.KeywordPerf | EventTrace.Keyword.KeywordHosting, EventTrace.Level.Verbose, (PresentationAppDomainManager.ActivationUri != null) ? PresentationAppDomainManager.ActivationUri.ToString() : string.Empty);
            }
            ObjectHandle result;

            if (PresentationAppDomainManager.ActivationUri != null)
            {
                result = base.CreateInstance(actCtx, new string[]
                {
                    BindUriHelper.UriToString(PresentationAppDomainManager.ActivationUri),
                    PresentationAppDomainManager.IsDebug.ToString(),
                    (PresentationAppDomainManager.DebugSecurityZoneURL == null) ? string.Empty : PresentationAppDomainManager.DebugSecurityZoneURL.ToString()
                });
            }
            else
            {
                result = base.CreateInstance(actCtx);
            }
            bool flag = false;

            try
            {
                new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
                if (AppDomain.CurrentDomain.ActivationContext != null && AppDomain.CurrentDomain.ActivationContext.Identity.ToString().Equals(actCtx.Identity.ToString()))
                {
                    flag = true;
                }
            }
            finally
            {
                CodeAccessPermission.RevertAssert();
            }
            EventTrace.EasyTraceEvent(EventTrace.Keyword.KeywordPerf | EventTrace.Keyword.KeywordHosting, EventTrace.Level.Verbose, EventTrace.Event.WpfHost_ApplicationActivatorCreateInstanceEnd);
            if (flag)
            {
                return(new ObjectHandle(AppDomain.CurrentDomain));
            }
            return(result);
        }
Beispiel #7
0
        // Token: 0x06005457 RID: 21591 RVA: 0x001757B4 File Offset: 0x001739B4
        protected override Size ArrangeOverride(Size arrangeSize)
        {
            bool flag = this.IsScrollClient && EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

            if (flag)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:ArrangeOverride");
            }
            try
            {
                int visualChildrenCount = this.VisualChildrenCount;
                if (this.IsScrollClient)
                {
                    this.VerifyScrollData(arrangeSize, this._scrollData._extent);
                }
                if (visualChildrenCount > 0)
                {
                    this._adornerLayer.Arrange(new Rect(arrangeSize));
                    UIElement uielement = this.GetVisualChild(0) as UIElement;
                    if (uielement != null)
                    {
                        Rect finalRect = new Rect(uielement.DesiredSize);
                        if (this.IsScrollClient)
                        {
                            finalRect.X = -this.HorizontalOffset;
                            finalRect.Y = -this.VerticalOffset;
                        }
                        finalRect.Width  = Math.Max(finalRect.Width, arrangeSize.Width);
                        finalRect.Height = Math.Max(finalRect.Height, arrangeSize.Height);
                        uielement.Arrange(finalRect);
                    }
                }
            }
            finally
            {
                if (flag)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "SCROLLCONTENTPRESENTER:ArrangeOverride");
                }
            }
            return(arrangeSize);
        }
Beispiel #8
0
        /// <summary>Arranges the content of a <see cref="T:System.Windows.Controls.StackPanel" /> element.</summary>
        /// <param name="arrangeSize">The <see cref="T:System.Windows.Size" /> that this element should use to arrange its child elements.</param>
        /// <returns>The <see cref="T:System.Windows.Size" /> that represents the arranged size of this <see cref="T:System.Windows.Controls.StackPanel" /> element and its child elements.</returns>
        // Token: 0x06005699 RID: 22169 RVA: 0x0017F450 File Offset: 0x0017D650
        protected override Size ArrangeOverride(Size arrangeSize)
        {
            bool flag = this.IsScrolling && EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

            if (flag)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "STACK:ArrangeOverride");
            }
            try
            {
                StackPanel.StackArrangeHelper(this, this._scrollData, arrangeSize);
            }
            finally
            {
                if (flag)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "STACK:ArrangeOverride");
                }
            }
            return(arrangeSize);
        }
            //[CodeAnalysis("AptcaMethodsShouldOnlyCallAptcaMethods")] //Tracking
            internal override bool BuildVisualTree(FrameworkElement container)
            {
                bool tracingEnabled = EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

                if (tracingEnabled)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "ContentPresenter.BuildVisualTree");
                }
                try
                {
                    ContentPresenter cp     = (ContentPresenter)container;
                    Visual           result = DefaultExpansion(cp.Content, cp);
                    return(result != null);
                }
                finally
                {
                    if (tracingEnabled)
                    {
                        EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, String.Format(System.Globalization.CultureInfo.InvariantCulture, "ContentPresenter.BuildVisualTree for CP {0}", container.GetHashCode()));
                    }
                }
            }
Beispiel #10
0
        /// <summary>Measures the child elements of a <see cref="T:System.Windows.Controls.StackPanel" /> in anticipation of arranging them during the <see cref="M:System.Windows.Controls.StackPanel.ArrangeOverride(System.Windows.Size)" /> pass.</summary>
        /// <param name="constraint">An upper limit <see cref="T:System.Windows.Size" /> that should not be exceeded.</param>
        /// <returns>The <see cref="T:System.Windows.Size" /> that represents the desired size of the element.</returns>
        // Token: 0x06005697 RID: 22167 RVA: 0x0017F04C File Offset: 0x0017D24C
        protected override Size MeasureOverride(Size constraint)
        {
            Size result = default(Size);
            bool flag   = this.IsScrolling && EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);

            if (flag)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "STACK:MeasureOverride");
            }
            try
            {
                result = StackPanel.StackMeasureHelper(this, this._scrollData, constraint);
            }
            finally
            {
                if (flag)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "STACK:MeasureOverride");
                }
            }
            return(result);
        }
Beispiel #11
0
        private Size RealMeasureOverride(Size constraint)
        {
#endif
            Size stackDesiredSize  = new Size();
            bool etwTracingEnabled = IsScrolling && EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info);
            if (etwTracingEnabled)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringBegin, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "STACK:MeasureOverride");
            }
            try
            {
                // Call the measure helper.
                stackDesiredSize = StackMeasureHelper(this, _scrollData, constraint);
            }
            finally
            {
                if (etwTracingEnabled)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientStringEnd, EventTrace.Keyword.KeywordGeneral, EventTrace.Level.Info, "STACK:MeasureOverride");
                }
            }

            return(stackDesiredSize);
        }
Beispiel #12
0
        /// <summary>
        /// Render method renders the visual tree.
        /// </summary>
        void ICompositionTarget.Render(bool inResize, DUCE.Channel channel)
        {
#if DEBUG_CLR_MEM
            bool clrTracingEnabled = false;

            if (CLRProfilerControl.ProcessIsUnderCLRProfiler &&
                (CLRProfilerControl.CLRLoggingLevel >= CLRProfilerControl.CLRLogState.Performance))
            {
                clrTracingEnabled = true;
                ++_renderCLRPass;
                CLRProfilerControl.CLRLogWriteLine("Begin_FullRender_{0}", _renderCLRPass);
            }
#endif // DEBUG_CLR_MEM

            //
            // Now we render the scene
            //

#if MEDIA_PERFORMANCE_COUNTERS
            _frameRateTimer.Begin();
#endif

            if (_rootVisual.Value != null)
            {
                bool etwTracingEnabled = false;

                if (EventTrace.IsEnabled(EventTrace.Keyword.KeywordGeneral | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info))
                {
                    etwTracingEnabled = true;
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientPrecomputeSceneBegin, EventTrace.Keyword.KeywordGraphics | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info, PerfService.GetPerfElementID(this));
                }

#if MEDIA_PERFORMANCE_COUNTERS
                _precomputeRateTimer.Begin();
#endif
                // precompute is channel agnostic
                _rootVisual.Value.Precompute();

#if MEDIA_PERFORMANCE_COUNTERS
                _precomputeRateTimer.End();
#endif

                if (etwTracingEnabled)
                {
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientPrecomputeSceneEnd, EventTrace.Keyword.KeywordGraphics | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info);
                }

#if DEBUG
                MediaTrace.RenderPass.Trace("Full Update");
#endif

                if (etwTracingEnabled)
                {
                    EventTrace.EventProvider.TraceEvent(
                        EventTrace.Event.WClientCompileSceneBegin, EventTrace.Keyword.KeywordGraphics | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info, PerfService.GetPerfElementID(this));
                }

#if MEDIA_PERFORMANCE_COUNTERS
                _renderRateTimer.Begin();
#endif

                Compile(channel);

#if MEDIA_PERFORMANCE_COUNTERS
                _renderRateTimer.End();
#endif

                if (etwTracingEnabled)
                {
                    EventTrace.EventProvider.TraceEvent(
                        EventTrace.Event.WClientCompileSceneEnd, EventTrace.Keyword.KeywordGraphics | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info);
                }
            }

#if DEBUG_CLR_MEM
            if (clrTracingEnabled &&
                CLRProfilerControl.CLRLoggingLevel >= CLRProfilerControl.CLRLogState.Performance)
            {
                CLRProfilerControl.CLRLogWriteLine("End_FullRender_{0}", _renderCLRPass);
            }
#endif // DEBUG_CLR_MEM



#if MEDIA_PERFORMANCE_COUNTERS
            _frameRateTimer.End();
            System.Console.WriteLine("RENDERING PERFORMANCE DATA");
            System.Console.WriteLine("Frame rendering time:  " + _frameRateTimer.TimeOfLastPeriod + "ms");
            System.Console.WriteLine("Frame precompute time: " + _precomputeRateTimer.TimeOfLastPeriod + "ms");
            System.Console.WriteLine("Frame render time:     " + _renderRateTimer.TimeOfLastPeriod + "ms");
#endif
        }
        private static object Load(System.Xaml.XamlReader xamlReader, IXamlObjectWriterFactory writerFactory,
                                   bool skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
        {
            XamlObjectWriter xamlWriter           = null;
            XamlContextStack <WpfXamlFrame> stack = new XamlContextStack <WpfXamlFrame>(() => new WpfXamlFrame());
            int persistId = 1;

            settings.AfterBeginInitHandler = delegate(object sender, System.Xaml.XamlObjectEventArgs args)
            {
                if (EventTrace.IsEnabled(EventTrace.Keyword.KeywordXamlBaml | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Verbose))
                {
                    IXamlLineInfo ixli = xamlReader as IXamlLineInfo;

                    int lineNumber   = -1;
                    int linePosition = -1;

                    if (ixli != null && ixli.HasLineInfo)
                    {
                        lineNumber   = ixli.LineNumber;
                        linePosition = ixli.LinePosition;
                    }

                    EventTrace.EventProvider.TraceEvent(
                        EventTrace.Event.WClientParseXamlBamlInfo,
                        EventTrace.Keyword.KeywordXamlBaml | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Verbose,
                        args.Instance == null ? 0 : PerfService.GetPerfElementID(args.Instance),
                        lineNumber,
                        linePosition);
                }

                UIElement uiElement = args.Instance as UIElement;
                if (uiElement != null)
                {
                    uiElement.SetPersistId(persistId++);
                }

                XamlSourceInfoHelper.SetXamlSourceInfo(args.Instance, args, baseUri);

                DependencyObject dObject = args.Instance as DependencyObject;
                if (dObject != null && stack.CurrentFrame.XmlnsDictionary != null)
                {
                    XmlnsDictionary dictionary = stack.CurrentFrame.XmlnsDictionary;
                    dictionary.Seal();

                    XmlAttributeProperties.SetXmlnsDictionary(dObject, dictionary);
                }

                stack.CurrentFrame.Instance = args.Instance;
            };
            if (writerFactory != null)
            {
                xamlWriter = writerFactory.GetXamlObjectWriter(settings);
            }
            else
            {
                xamlWriter = new System.Xaml.XamlObjectWriter(xamlReader.SchemaContext, settings);
            }

            IXamlLineInfo xamlLineInfo = null;

            try
            {
                //Handle Line Numbers
                xamlLineInfo = xamlReader as IXamlLineInfo;
                IXamlLineInfoConsumer xamlLineInfoConsumer = xamlWriter as IXamlLineInfoConsumer;
                bool shouldPassLineNumberInfo = false;
                if ((xamlLineInfo != null && xamlLineInfo.HasLineInfo) &&
                    (xamlLineInfoConsumer != null && xamlLineInfoConsumer.ShouldProvideLineInfo))
                {
                    shouldPassLineNumberInfo = true;
                }

                IStyleConnector styleConnector = rootObject as IStyleConnector;
                TransformNodes(xamlReader, xamlWriter,
                               false /*onlyLoadOneNode*/,
                               skipJournaledProperties,
                               shouldPassLineNumberInfo, xamlLineInfo, xamlLineInfoConsumer,
                               stack, styleConnector);
                xamlWriter.Close();
                return(xamlWriter.Result);
            }
            catch (Exception e)
            {
                // Don't wrap critical exceptions or already-wrapped exceptions.
                if (MS.Internal.CriticalExceptions.IsCriticalException(e) || !XamlReader.ShouldReWrapException(e, baseUri))
                {
                    throw;
                }
                XamlReader.RewrapException(e, xamlLineInfo, baseUri);
                return(null);    // this should never be executed
            }
        }
        internal IntPtr FilterMessage(IntPtr hwnd, WindowMessage message, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            IntPtr result = IntPtr.Zero;

            // It is possible to be re-entered during disposal.  Just return.
            if (null == _source || null == _source.Value)
            {
                return(result);
            }

            _msgTime = 0;
            try
            {
                _msgTime = SafeNativeMethods.GetMessageTime();
            }
            catch (System.ComponentModel.Win32Exception)
            {
                System.Diagnostics.Debug.WriteLine("HwndKeyboardInputProvider: GetMessageTime failed!");
            }

            switch (message)
            {
            // WM_KEYDOWN is sent when a nonsystem key is pressed.
            // A nonsystem key is a key that is pressed when the ALT key
            // is not pressed.
            // WM_SYSKEYDOWN is sent when a system key is pressed.
            case WindowMessage.WM_SYSKEYDOWN:
            case WindowMessage.WM_KEYDOWN:
            {
                // If we have a IKeyboardInputSite, then we should have already
                // called ProcessKeyDown (from TranslateAccelerator)
                // But there are several paths (our message pump / app's message
                // pump) where we do (or don't) call through IKeyboardInputSink.
                // So the best way is to just check here if we already did it.
                if (_source.Value.IsRepeatedKeyboardMessage(hwnd, (int)message, wParam, lParam))
                {
                    break;
                }

                // We will use the current time before generating KeyDown events so we can filter
                // the later posted WM_CHAR.
                int currentTime = 0;
                try
                {
                    currentTime = SafeNativeMethods.GetTickCount();
                }
                catch (System.ComponentModel.Win32Exception)
                {
                    System.Diagnostics.Debug.WriteLine("HwndMouseInputProvider: GetTickCount failed!");
                }

                // MITIGATION: HANDLED_KEYDOWN_STILL_GENERATES_CHARS
                // In case a nested message pump is used before we return
                // from processing this message, we disable processing the
                // next WM_CHAR message because if the code pumps messages
                // it should really mark the message as handled.
                HwndSource._eatCharMessages = true;
                DispatcherOperation restoreCharMessages = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new DispatcherOperationCallback(HwndSource.RestoreCharMessages), null);

                // Force the Dispatcher to post a new message to service any
                // pending operations, so that the operation we just posted
                // is guaranteed to get dispatched after any pending WM_CHAR
                // messages are dispatched.
                Dispatcher.CriticalRequestProcessing(true);

                MSG msg = new MSG(hwnd, (int)message, wParam, lParam, _msgTime, 0, 0);
                ProcessKeyAction(ref msg, ref handled);

                if (!handled)
                {
                    // MITIGATION: HANDLED_KEYDOWN_STILL_GENERATES_CHARS
                    // We did not handle the WM_KEYDOWN, so it is OK to process WM_CHAR messages.
                    // We can also abort the pending restore operation since we don't need it.
                    HwndSource._eatCharMessages = false;
                    restoreCharMessages.Abort();
                }

                // System.Console.WriteLine("KEYDOWN(message={0}, wParam={1})={2}", message, wParam, handled);
            }
            break;

            // WM_KEYUP is sent when a nonsystem key is released.
            // A nonsystem key is a key that is pressed when the ALT key
            // is not pressed.
            // WM_SYSKEYUP is sent when a system key is released.
            case WindowMessage.WM_SYSKEYUP:
            case WindowMessage.WM_KEYUP:
            {
                if (_source.Value.IsRepeatedKeyboardMessage(hwnd, (int)message, wParam, lParam))
                {
                    break;
                }

                MSG msg = new MSG(hwnd, (int)message, wParam, lParam, _msgTime, 0, 0);
                ProcessKeyAction(ref msg, ref handled);
                // System.Console.WriteLine("KEYUP  (message={0}, wParam={1})={2}", message, wParam, handled);
            }
            break;

            //

            case WindowMessage.WM_CHAR:
            case WindowMessage.WM_DEADCHAR:
            case WindowMessage.WM_SYSCHAR:
            case WindowMessage.WM_SYSDEADCHAR:
            {
                if (_source.Value.IsRepeatedKeyboardMessage(hwnd, (int)message, wParam, lParam))
                {
                    break;
                }

                // MITIGATION: HANDLED_KEYDOWN_STILL_GENERATES_CHARS
                if (HwndSource._eatCharMessages)
                {
                    break;
                }

                ProcessTextInputAction(hwnd, message, wParam, lParam, ref handled);
                // System.Console.WriteLine("CHAR(message={0}, wParam={1})={2}", message, wParam, handled);
            }
            break;

            case WindowMessage.WM_EXITMENULOOP:
            case WindowMessage.WM_EXITSIZEMOVE:
            {
                // MITIGATION: KEYBOARD_STATE_OUT_OF_SYNC
                //
                // Avalon relies on keeping it's copy of the keyboard
                // state.  This is for a number of reasons, including that
                // we need to be able to give this state to worker threads.
                //
                // There are a number of cases where Win32 eats the
                // keyboard messages, and this can cause our keyboard
                // state to become stale.  Obviously this can happen when
                // another app is in the foreground, but we handle that
                // by re-synching our keyboard state when we get focus.
                //
                // Other times are when Win32 enters a nested loop.  While
                // any one could enter a nested loop at any time for any
                // reason, Win32 is nice enough to let us know when it is
                // finished with the two common loops: menus and sizing.
                // We re-sync our keyboard device in response to these.
                //
                if (_active)
                {
                    _partialActive = true;

                    ReportInput(hwnd,
                                InputMode.Foreground,
                                _msgTime,
                                RawKeyboardActions.Activate,
                                0,
                                false,
                                false,
                                0);
                }
            }
            break;

            // WM_SETFOCUS is sent immediately after focus is granted.
            // This is our clue that the keyboard is active.
            case WindowMessage.WM_SETFOCUS:
            {
                OnSetFocus(hwnd);

                handled = true;
            }
            break;

            // WM_KILLFOCUS is sent immediately before focus is removed.
            // This is our clue that the keyboard is inactive.
            case WindowMessage.WM_KILLFOCUS:
            {
                if (_active && wParam != _source.Value.CriticalHandle)
                {
                    // Console.WriteLine("WM_KILLFOCUS");

                    if (_source.Value.RestoreFocusMode == RestoreFocusMode.Auto)
                    {
                        // when the window that's acquiring focus (wParam) is
                        // a descendant of our window, remember the immediate
                        // child so that we can restore focus to it.
                        _restoreFocusWindow = GetImmediateChildFor((IntPtr)wParam, _source.Value.CriticalHandle);

                        _restoreFocus = null;

                        // If we aren't restoring focus to a child window,
                        // then restore focus to the element that currently
                        // has WPF keyboard focus if it is directly in this
                        // HwndSource.
                        if (_restoreFocusWindow == IntPtr.Zero)
                        {
                            DependencyObject focusedDO = Keyboard.FocusedElement as DependencyObject;
                            if (focusedDO != null)
                            {
                                HwndSource hwndSource = PresentationSource.CriticalFromVisual(focusedDO) as HwndSource;
                                if (hwndSource == _source.Value)
                                {
                                    _restoreFocus = focusedDO as IInputElement;
                                }
                            }
                        }
                    }

                    PossiblyDeactivate((IntPtr)wParam);
                }

                handled = true;
            }
            break;

            // WM_UPDATEUISTATE is sent when the user presses ALT, expecting
            // the app to display accelerator keys.  We don't always hear the
            // keystroke - another message loop may handle it.  So report it
            // here.
            case WindowMessage.WM_UPDATEUISTATE:
            {
                RawUIStateInputReport report =
                    new RawUIStateInputReport(_source.Value,
                                              InputMode.Foreground,
                                              _msgTime,
                                              (RawUIStateActions)NativeMethods.SignedLOWORD((int)wParam),
                                              (RawUIStateTargets)NativeMethods.SignedHIWORD((int)wParam));

                _site.Value.ReportInput(report);

                handled = true;
            }
            break;
            }

            if (handled && EventTrace.IsEnabled(EventTrace.Keyword.KeywordInput | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info))
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientInputMessage,
                                                    EventTrace.Keyword.KeywordInput | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info,
                                                    Dispatcher.GetHashCode(),
                                                    hwnd.ToInt64(),
                                                    message,
                                                    (int)wParam,
                                                    (int)lParam);
            }

            return(result);
        }
Beispiel #15
0
        /// <summary>
        /// Tells ContextLayoutManager to finalize possibly async update.
        /// Used before accessing services off Visual.
        /// </summary>

        //[CodeAnalysis("AptcaMethodsShouldOnlyCallAptcaMethods")] //Tracking
        internal void UpdateLayout()
        {
            VerifyAccess();

            //make UpdateLayout to be a NOP if called during UpdateLayout.
            if (_isInUpdateLayout ||
                _measuresOnStack > 0 ||
                _arrangesOnStack > 0 ||
                _isDead)
            {
                return;
            }

#if DEBUG_CLR_MEM
            bool clrTracingEnabled = false;

            // Start over with the Measure and arrange counters for this layout pass
            int measureCLRPass = 0;
            int arrangeCLRPass = 0;

            if (CLRProfilerControl.ProcessIsUnderCLRProfiler)
            {
                clrTracingEnabled = true;
                if (CLRProfilerControl.CLRLoggingLevel >= CLRProfilerControl.CLRLogState.Performance)
                {
                    ++_layoutCLRPass;
                    CLRProfilerControl.CLRLogWriteLine("Begin_Layout_{0}", _layoutCLRPass);
                }
            }
#endif // DEBUG_CLR_MEM

            bool etwTracingEnabled = false;
            long perfElementID     = 0;
            const EventTrace.Keyword etwKeywords = EventTrace.Keyword.KeywordLayout | EventTrace.Keyword.KeywordPerf;
            if (!_isUpdating && EventTrace.IsEnabled(etwKeywords, EventTrace.Level.Info))
            {
                etwTracingEnabled = true;
                perfElementID     = PerfService.GetPerfElementID(this);
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientLayoutBegin, etwKeywords, EventTrace.Level.Info,
                                                    perfElementID, EventTrace.LayoutSource.LayoutManager);
            }

            int       cnt            = 0;
            bool      gotException   = true;
            UIElement currentElement = null;

            try
            {
                invalidateTreeIfRecovering();


                while (hasDirtiness || _firePostLayoutEvents)
                {
                    if (++cnt > 153)
                    {
                        //loop detected. Lets go over to background to let input/user to correct the situation.
                        //most frequently, we get such a loop as a result of input detecting a mouse in the "bad spot"
                        //and some event handler oscillating a layout-affecting property depending on hittest result
                        //of the mouse. Going over to background will not break the loopp but will allow user to
                        //move the mouse so that it goes out of the "bad spot".
                        Dispatcher.BeginInvoke(DispatcherPriority.Background, _updateLayoutBackground, this);
                        currentElement = null;
                        gotException   = false;
                        if (etwTracingEnabled)
                        {
                            EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientLayoutAbort, etwKeywords, EventTrace.Level.Info, 0, cnt);
                        }
                        return;
                    }


                    //this flag stops posting update requests to MediaContext - we are already in one
                    //note that _isInUpdateLayout is close but different - _isInUpdateLayout is reset
                    //before firing LayoutUpdated so that event handlers could call UpdateLayout but
                    //still could not cause posting of MediaContext work item. Posting MediaContext workitem
                    //causes infinite loop in MediaContext.
                    _isUpdating       = true;
                    _isInUpdateLayout = true;

#if DEBUG_CLR_MEM
                    if (clrTracingEnabled && (CLRProfilerControl.CLRLoggingLevel >= CLRProfilerControl.CLRLogState.Verbose))
                    {
                        ++measureCLRPass;
                        CLRProfilerControl.CLRLogWriteLine("Begin_Measure_{0}_{1}", _layoutCLRPass, measureCLRPass);
                    }
#endif // DEBUG_CLR_MEM

                    if (etwTracingEnabled)
                    {
                        EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientMeasureBegin, etwKeywords, EventTrace.Level.Info, perfElementID);
                    }

                    // Disable processing of the queue during blocking operations to prevent unrelated reentrancy.
                    using (Dispatcher.DisableProcessing())
                    {
                        //loop for Measure
                        //We limit the number of loops here by time - normally, all layout
                        //calculations should be done by this time, this limit is here for
                        //emergency, "infinite loop" scenarios - yielding in this case will
                        //provide user with ability to continue to interact with the app, even though
                        //it will be sluggish. If we don't yield here, the loop is goign to be a deadly one
                        //and it will be impossible to save results or even close the window.
                        int      loopCounter   = 0;
                        DateTime loopStartTime = new DateTime(0);
                        while (true)
                        {
                            if (++loopCounter > 153)
                            {
                                loopCounter = 0;
                                //first bunch of iterations is free, then we start count time
                                //this way, we don't call DateTime.Now in most layout updates
                                if (loopStartTime.Ticks == 0)
                                {
                                    loopStartTime = DateTime.UtcNow;
                                }
                                else
                                {
                                    TimeSpan loopDuration = (DateTime.UtcNow - loopStartTime);
                                    if (loopDuration.Milliseconds > 153 * 2) // 153*2 = magic*science
                                    {
                                        //loop detected. Lets go over to background to let input work.
                                        Dispatcher.BeginInvoke(DispatcherPriority.Background, _updateLayoutBackground, this);
                                        currentElement = null;
                                        gotException   = false;
                                        if (etwTracingEnabled)
                                        {
                                            EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientMeasureAbort, etwKeywords, EventTrace.Level.Info,
                                                                                loopDuration.Milliseconds, loopCounter);
                                        }
                                        return;
                                    }
                                }
                            }

                            currentElement = MeasureQueue.GetTopMost();

                            if (currentElement == null)
                            {
                                break;                        //exit if no more Measure candidates
                            }
                            currentElement.Measure(currentElement.PreviousConstraint);
//dmitryt,
                        }

                        if (etwTracingEnabled)
                        {
                            EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientMeasureEnd, etwKeywords, EventTrace.Level.Info, loopCounter);
                            EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientArrangeBegin, etwKeywords, EventTrace.Level.Info, perfElementID);
                        }


#if DEBUG_CLR_MEM
                        if (clrTracingEnabled && (CLRProfilerControl.CLRLoggingLevel >= CLRProfilerControl.CLRLogState.Verbose))
                        {
                            CLRProfilerControl.CLRLogWriteLine("End_Measure_{0}_{1}", _layoutCLRPass, measureCLRPass);
                            ++arrangeCLRPass;
                            CLRProfilerControl.CLRLogWriteLine("Begin_Arrange_{0}_{1}", _layoutCLRPass, arrangeCLRPass);
                        }
#endif // DEBUG_CLR_MEM

                        //loop for Arrange
                        //if Arrange dirtied the tree go clean it again

                        //We limit the number of loops here by time - normally, all layout
                        //calculations should be done by this time, this limit is here for
                        //emergency, "infinite loop" scenarios - yielding in this case will
                        //provide user with ability to continue to interact with the app, even though
                        //it will be sluggish. If we don't yield here, the loop is goign to be a deadly one
                        //and it will be impossible to save results or even close the window.
                        loopCounter   = 0;
                        loopStartTime = new DateTime(0);
                        while (MeasureQueue.IsEmpty)
                        {
                            if (++loopCounter > 153)
                            {
                                loopCounter = 0;
                                //first bunch of iterations is free, then we start count time
                                //this way, we don't call DateTime.Now in most layout updates
                                if (loopStartTime.Ticks == 0)
                                {
                                    loopStartTime = DateTime.UtcNow;
                                }
                                else
                                {
                                    TimeSpan loopDuration = (DateTime.UtcNow - loopStartTime);
                                    if (loopDuration.Milliseconds > 153 * 2) // 153*2 = magic*science
                                    {
                                        //loop detected. Lets go over to background to let input work.
                                        Dispatcher.BeginInvoke(DispatcherPriority.Background, _updateLayoutBackground, this);
                                        currentElement = null;
                                        gotException   = false;
                                        if (etwTracingEnabled)
                                        {
                                            EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientArrangeAbort, etwKeywords, EventTrace.Level.Info,
                                                                                loopDuration.Milliseconds, loopCounter);
                                        }
                                        return;
                                    }
                                }
                            }

                            currentElement = ArrangeQueue.GetTopMost();

                            if (currentElement == null)
                            {
                                break;                        //exit if no more Measure candidates
                            }
                            Rect finalRect = getProperArrangeRect(currentElement);

                            currentElement.Arrange(finalRect);
//dmitryt,
                        }

                        if (etwTracingEnabled)
                        {
                            EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientArrangeEnd, etwKeywords, EventTrace.Level.Info, loopCounter);
                        }

#if DEBUG_CLR_MEM
                        if (clrTracingEnabled && (CLRProfilerControl.CLRLoggingLevel >= CLRProfilerControl.CLRLogState.Verbose))
                        {
                            CLRProfilerControl.CLRLogWriteLine("End_Arrange_{0}_{1}", _layoutCLRPass, arrangeCLRPass);
                        }
#endif // DEBUG_CLR_MEM

                        //if Arrange dirtied the tree go clean it again
                        //it is not neccesary to check ArrangeQueue sicnce we just exited from Arrange loop
                        if (!MeasureQueue.IsEmpty)
                        {
                            continue;
                        }

                        //let LayoutUpdated handlers to call UpdateLayout
                        //note that it means we can get reentrancy into UpdateLayout past this point,
                        //if any of event handlers call UpdateLayout sync. Need to protect from reentrancy
                        //in the firing methods below.
                        _isInUpdateLayout = false;
                    }

                    fireSizeChangedEvents();
                    if (hasDirtiness)
                    {
                        continue;
                    }
                    fireLayoutUpdateEvent();
                    if (hasDirtiness)
                    {
                        continue;
                    }
                    fireAutomationEvents();
                    if (hasDirtiness)
                    {
                        continue;
                    }
                    fireSizeChangedEvents(); // if nothing is dirty, one last chance for any size changes to announce.
                }

                currentElement = null;
                gotException   = false;
            }
            finally
            {
                _isUpdating          = false;
                _layoutRequestPosted = false;
                _isInUpdateLayout    = false;

                if (gotException)
                {
                    if (etwTracingEnabled)
                    {
                        EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientLayoutException, etwKeywords, EventTrace.Level.Info, PerfService.GetPerfElementID(currentElement));
                    }

                    //set indicator
                    _gotException       = true;
                    _forceLayoutElement = currentElement;

                    //make attempt to request the subsequent layout calc
                    //some exception handler schemas use Idle priorities to
                    //wait until dust settles. Then they correct the issue noted in the exception handler.
                    //We don't want to attempt to re-do the operation on the priority higher then that.
                    Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, _updateLayoutBackground, this);
                }
            }

            MS.Internal.Text.TextInterface.Font.ResetFontFaceCache();
            MS.Internal.FontCache.BufferCache.Reset();

            if (etwTracingEnabled)
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientLayoutEnd, etwKeywords, EventTrace.Level.Info);
            }

#if DEBUG_CLR_MEM
            if (clrTracingEnabled && (CLRProfilerControl.CLRLoggingLevel >= CLRProfilerControl.CLRLogState.Performance))
            {
                CLRProfilerControl.CLRLogWriteLine("End_Layout_{0}", _layoutCLRPass);
            }
#endif // DEBUG_CLR_MEM
        }
Beispiel #16
0
        internal IntPtr FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            IntPtr result = IntPtr.Zero;

            // It is possible to be re-entered during disposal.  Just return.
            if (null == _source || null == _source.Value)
            {
                return(result);
            }

            switch (msg)
            {
            case WindowMessage.WM_ENABLE:
                _stylusLogic.Value.OnWindowEnableChanged(hwnd, (int)NativeMethods.IntPtrToInt32(wParam) == 0);
                break;

            case WindowMessage.WM_TABLET_QUERYSYSTEMGESTURESTATUS:
                handled = true;

                NativeMethods.POINT pt1 = new NativeMethods.POINT(
                    NativeMethods.SignedLOWORD(lParam),
                    NativeMethods.SignedHIWORD(lParam));
                SafeNativeMethods.ScreenToClient(new HandleRef(this, hwnd), pt1);
                Point ptClient1 = new Point(pt1.x, pt1.y);

                IInputElement inputElement = StylusDevice.LocalHitTest(_source.Value, ptClient1);
                if (inputElement != null)
                {
                    // walk up the parent chain
                    DependencyObject elementCur             = (DependencyObject)inputElement;
                    bool             isPressAndHoldEnabled  = Stylus.GetIsPressAndHoldEnabled(elementCur);
                    bool             isFlicksEnabled        = Stylus.GetIsFlicksEnabled(elementCur);
                    bool             isTapFeedbackEnabled   = Stylus.GetIsTapFeedbackEnabled(elementCur);
                    bool             isTouchFeedbackEnabled = Stylus.GetIsTouchFeedbackEnabled(elementCur);

                    uint flags = 0;

                    if (!isPressAndHoldEnabled)
                    {
                        flags |= TABLET_PRESSANDHOLD_DISABLED;
                    }

                    if (!isTapFeedbackEnabled)
                    {
                        flags |= TABLET_TAPFEEDBACK_DISABLED;
                    }

                    if (isTouchFeedbackEnabled)
                    {
                        flags |= TABLET_TOUCHUI_FORCEON;
                    }
                    else
                    {
                        flags |= TABLET_TOUCHUI_FORCEOFF;
                    }

                    if (!isFlicksEnabled)
                    {
                        flags |= TABLET_FLICKS_DISABLED;
                    }

                    result = new IntPtr(flags);
                }
                break;

            case WindowMessage.WM_TABLET_FLICK:
                handled = true;

                int flickData = NativeMethods.IntPtrToInt32(wParam);

                // We always handle any scroll actions if we are enabled.  We do this when we see the SystemGesture Flick come through.
                // Note: Scrolling happens on window flicked on even if it is not the active window.
                if (_stylusLogic != null && _stylusLogic.Value.Enabled && (StylusLogic.GetFlickAction(flickData) == 1))
                {
                    result = new IntPtr(0x0001);     // tell UIHub the flick has already been handled.
                }
                break;
            }

            if (handled && EventTrace.IsEnabled(EventTrace.Keyword.KeywordInput | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info))
            {
                EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientInputMessage, EventTrace.Keyword.KeywordInput | EventTrace.Keyword.KeywordPerf, EventTrace.Level.Info,
                                                    (_source.Value.CompositionTarget != null ? _source.Value.CompositionTarget.Dispatcher.GetHashCode() : 0),
                                                    hwnd.ToInt64(),
                                                    msg,
                                                    (int)wParam,
                                                    (int)lParam);
            }

            return(result);
        }
Beispiel #17
0
        // Token: 0x0600226A RID: 8810 RVA: 0x000AAE10 File Offset: 0x000A9010
        private static object Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, bool skipJournaledProperties, object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
        {
            XamlContextStack <WpfXamlFrame> stack = new XamlContextStack <WpfXamlFrame>(() => new WpfXamlFrame());
            int persistId = 1;

            settings.AfterBeginInitHandler = delegate(object sender, XamlObjectEventArgs args)
            {
                if (EventTrace.IsEnabled(EventTrace.Keyword.KeywordPerf | EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose))
                {
                    IXamlLineInfo xamlLineInfo2 = xamlReader as IXamlLineInfo;
                    int           num           = -1;
                    int           num2          = -1;
                    if (xamlLineInfo2 != null && xamlLineInfo2.HasLineInfo)
                    {
                        num  = xamlLineInfo2.LineNumber;
                        num2 = xamlLineInfo2.LinePosition;
                    }
                    EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientParseXamlBamlInfo, EventTrace.Keyword.KeywordPerf | EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose, new object[]
                    {
                        (args.Instance == null) ? 0L : PerfService.GetPerfElementID(args.Instance),
                        num,
                        num2
                    });
                }
                UIElement uielement = args.Instance as UIElement;
                if (uielement != null)
                {
                    UIElement uielement2 = uielement;
                    int       persistId  = persistId;
                    persistId++;
                    uielement2.SetPersistId(persistId);
                }
                XamlSourceInfoHelper.SetXamlSourceInfo(args.Instance, args, baseUri);
                DependencyObject dependencyObject = args.Instance as DependencyObject;
                if (dependencyObject != null && stack.CurrentFrame.XmlnsDictionary != null)
                {
                    XmlnsDictionary xmlnsDictionary = stack.CurrentFrame.XmlnsDictionary;
                    xmlnsDictionary.Seal();
                    XmlAttributeProperties.SetXmlnsDictionary(dependencyObject, xmlnsDictionary);
                }
                stack.CurrentFrame.Instance = args.Instance;
            };
            XamlObjectWriter xamlObjectWriter;

            if (writerFactory != null)
            {
                xamlObjectWriter = writerFactory.GetXamlObjectWriter(settings);
            }
            else
            {
                xamlObjectWriter = new XamlObjectWriter(xamlReader.SchemaContext, settings);
            }
            IXamlLineInfo xamlLineInfo = null;
            object        result;

            try
            {
                xamlLineInfo = (xamlReader as IXamlLineInfo);
                IXamlLineInfoConsumer xamlLineInfoConsumer = xamlObjectWriter;
                bool shouldPassLineNumberInfo = false;
                if (xamlLineInfo != null && xamlLineInfo.HasLineInfo && xamlLineInfoConsumer != null && xamlLineInfoConsumer.ShouldProvideLineInfo)
                {
                    shouldPassLineNumberInfo = true;
                }
                IStyleConnector styleConnector = rootObject as IStyleConnector;
                WpfXamlLoader.TransformNodes(xamlReader, xamlObjectWriter, false, skipJournaledProperties, shouldPassLineNumberInfo, xamlLineInfo, xamlLineInfoConsumer, stack, styleConnector);
                xamlObjectWriter.Close();
                result = xamlObjectWriter.Result;
            }
            catch (Exception ex)
            {
                if (CriticalExceptions.IsCriticalException(ex) || !XamlReader.ShouldReWrapException(ex, baseUri))
                {
                    throw;
                }
                XamlReader.RewrapException(ex, xamlLineInfo, baseUri);
                result = null;
            }
            return(result);
        }