| File: MS\Internal\Documents\DocumentPageHost.cs | Web Access |
| Project: src\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj (PresentationFramework) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // // Description: Provides a view port for a page of content for a DocumentPage. // using System.Windows; // UIElement using System.Windows.Media; // Visual namespace MS.Internal.Documents { /// <summary> /// Provides a view port for a page of content for a DocumentPage. /// </summary> internal class DocumentPageHost : FrameworkElement { //------------------------------------------------------------------- // // Constructors // //------------------------------------------------------------------- #region Constructors /// <summary> /// Create an instance of a DocumentPageHost. /// </summary> internal DocumentPageHost() : base() { } #endregion Constructors //------------------------------------------------------------------- // // Internal Methods // //------------------------------------------------------------------- #region Internal Methods internal static void DisconnectPageVisual(Visual pageVisual) { // There might be a case where a visual associated with a page was // inserted to a visual tree before. It got removed later, but GC did not // destroy its parent yet. To workaround this case always check for the parent // of page visual and disconnect it, when necessary. Visual currentParent = VisualTreeHelper.GetParent(pageVisual) as Visual; if (currentParent != null) { ContainerVisual pageVisualHost = currentParent as ContainerVisual; if (pageVisualHost == null) throw new ArgumentException(SR.DocumentPageView_ParentNotDocumentPageHost, nameof(pageVisual)); DocumentPageHost docPageHost = VisualTreeHelper.GetParent(pageVisualHost) as DocumentPageHost; if (docPageHost == null) throw new ArgumentException(SR.DocumentPageView_ParentNotDocumentPageHost, nameof(pageVisual)); docPageHost.PageVisual = null; } } #endregion Internal Methods //------------------------------------------------------------------- // // Internal Properties // //------------------------------------------------------------------- #region Internal Properties /// <summary> /// Root of visual subtree hosted by this DocumentPageHost. /// </summary> internal Visual PageVisual { get { return _pageVisual; } set { ContainerVisual pageVisualHost; if (_pageVisual != null) { pageVisualHost = VisualTreeHelper.GetParent(_pageVisual) as ContainerVisual; Invariant.Assert(pageVisualHost != null); pageVisualHost.Children.Clear(); this.RemoveVisualChild(pageVisualHost); } _pageVisual = value; if (_pageVisual != null) { pageVisualHost = new ContainerVisual(); this.AddVisualChild(pageVisualHost); pageVisualHost.Children.Add(_pageVisual); pageVisualHost.SetValue(FlowDirectionProperty, FlowDirection.LeftToRight); } } } /// <summary> /// Internal cached offset. /// </summary> internal Point CachedOffset; #endregion Internal Properties #region VisualChildren /// <summary> /// Derived class must implement to support Visual children. The method must return /// the child at the specified index. Index must be between 0 and GetVisualChildrenCount-1. /// /// By default a Visual does not have any children. /// /// Remark: /// During this virtual call it is not valid to modify the Visual tree. /// </summary> protected override Visual GetVisualChild(int index) { if (index != 0 || _pageVisual == null) { throw new ArgumentOutOfRangeException(nameof(index), index, SR.Visual_ArgumentOutOfRange); } return VisualTreeHelper.GetParent(_pageVisual) as Visual; } /// <summary> /// Derived classes override this property to enable the Visual code to enumerate /// the Visual children. Derived classes need to return the number of children /// from this method. /// /// By default a Visual does not have any children. /// /// Remark: During this virtual method the Visual tree must not be modified. /// </summary> protected override int VisualChildrenCount { get { return _pageVisual != null ? 1 : 0; } } #endregion VisualChildren private Visual _pageVisual; } }