private ContainerVisual GetHeaderFooterVisualFromDataTemplate(FrameworkTemplate template, Rect container) { if (template == null) { return null; } var doc = Source as PrintableDocument; var content = template.LoadContent() as FrameworkElement; content.DataContext = doc.DataContext; var width = _definition.PageSize.Width - _definition.Margins.Left - _definition.Margins.Right; content.Measure(_definition.PageSize); content.Arrange(new Rect(container.X, container.Y, width, content.DesiredSize.Height)); content.UpdateLayout(); var visual = new ContainerVisual(); visual.Children.Add(content); return visual; }
private Size GetModelContentSize(object dataModel, FrameworkTemplate modelTemplate, Size availableSize) { FrameworkElement content = null; if (modelTemplate == null) { return Size.Empty; } content = modelTemplate.LoadContent() as FrameworkElement; if (content == null) { return Size.Empty; } content.DataContext = dataModel; content.Measure(availableSize); return content.DesiredSize; }
//+---------------------------------------------------------------------------------- // // ApplyTemplateContent // // Instantiate the content of the template (either from FEFs or from Baml). // This is done for every element to which this template is attached. // //+---------------------------------------------------------------------------------- #region InstantiateSubTree //[CodeAnalysis("AptcaMethodsShouldOnlyCallAptcaMethods")] //Tracking Bug: 29647 internal static bool ApplyTemplateContent( UncommonField<HybridDictionary[]> dataField, DependencyObject container, FrameworkElementFactory templateRoot, int lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate) { Debug.Assert(frameworkTemplate != null ); bool visualsCreated = false; FrameworkElement feContainer = container as FrameworkElement; // Is this a FEF-style template? if (templateRoot != null) { // Yes, we'll instantiate from a FEF tree. EventTrace.EasyTraceEvent(EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose, EventTrace.Event.WClientParseInstVisTreeBegin); CheckForCircularReferencesInTemplateTree(container, frameworkTemplate ); // Container is considered ChildIndex '0' (Self), but, // Container.ChildIndex isn't set List<DependencyObject> affectedChildren = new List<DependencyObject>(lastChildIndex); // Assign affectedChildren to container TemplatedFeChildrenField.SetValue(container, affectedChildren); // When building the template children chain, we keep a chain of // nodes that don't need to be in the chain for property invalidation // or lookup purposes. (And hence not assigned a TemplateChildIndex) // We only need them in order to clean up their _templatedParent // references (see FrameworkElement.ClearTemplateChain) List<DependencyObject> noChildIndexChildren = null; // Instantiate template // Setup container's reference to first child in chain // and add to tree DependencyObject treeRoot = templateRoot.InstantiateTree( dataField, container, container, affectedChildren, ref noChildIndexChildren, ref frameworkTemplate.ResourceDependents); Debug.Assert(treeRoot is FrameworkElement || treeRoot is FrameworkContentElement, "Root node of tree must be a FrameworkElement or FrameworkContentElement. This should have been caught by set_VisualTree" ); // From childFirst to childLast is the chain of child nodes with // childIndex. Append that chain with the chain of child nodes // with no childIndex assigned. if( noChildIndexChildren != null ) { affectedChildren.AddRange(noChildIndexChildren); } visualsCreated = true; if (feContainer != null && EventTrace.IsEnabled(EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose)) { string label = feContainer.Name; if (label == null || label.Length == 0) label = container.GetHashCode().ToString(System.Globalization.CultureInfo.InvariantCulture); EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientParseInstVisTreeEnd, EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose, String.Format(System.Globalization.CultureInfo.InvariantCulture, "Style.InstantiateSubTree for {0} {1}", container.GetType().Name, label)); } } // It's not a FEF-style template, is it a non-empty optimized one? else if (frameworkTemplate != null && frameworkTemplate.HasXamlNodeContent) { // Yes, create from the optimized template content. EventTrace.EasyTraceEvent(EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose, EventTrace.Event.WClientParseInstVisTreeBegin); CheckForCircularReferencesInTemplateTree(container, frameworkTemplate ); // Container is considered ChildIndex '0' (Self), but, // Container.ChildIndex isn't set List<DependencyObject> affectedChildren = new List<DependencyObject>(lastChildIndex); // Assign affectedChildren to container TemplatedFeChildrenField.SetValue(container, affectedChildren); DependencyObject treeRoot; // Load the content treeRoot = frameworkTemplate.LoadContent( container, affectedChildren); Debug.Assert(treeRoot == null || treeRoot is FrameworkElement || treeRoot is FrameworkContentElement, "Root node of tree must be a FrameworkElement or FrameworkContentElement. This should have been caught by set_VisualTree" ); visualsCreated = true; if (feContainer != null && EventTrace.IsEnabled(EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose)) { string label = feContainer.Name; if (label == null || label.Length == 0) label = container.GetHashCode().ToString(System.Globalization.CultureInfo.InvariantCulture); EventTrace.EventProvider.TraceEvent(EventTrace.Event.WClientParseInstVisTreeEnd, EventTrace.Keyword.KeywordXamlBaml, EventTrace.Level.Verbose, String.Format(System.Globalization.CultureInfo.InvariantCulture, "Style.InstantiateSubTree for {0} {1}", container.GetType().Name, label)); } } // No template was supplied. Allow subclasses to provide the template. // This is currently only implemented for FrameworkElement's. else { if (feContainer != null) { // This template will not be driven by the Style in any way. // Rather, it will be built and initialized by the callee // CALLBACK #if DEBUG Debug.Assert( feContainer._buildVisualTreeVerification == VerificationState.WaitingForBuildVisualTree, "The BuildVisualTree override has triggered another call to itself. This is not good - something between the two Style.InstantiateSubTree calls on the stack is doing A Very Bad Thing."); feContainer._buildVisualTreeVerification = VerificationState.WaitingForAddCustomTemplateRoot; bool exceptionThrown = true; try { #endif Debug.Assert(frameworkTemplate != null, "Only FrameworkTemplate has the ability to build a VisualTree by this means"); visualsCreated = frameworkTemplate.BuildVisualTree(feContainer); #if DEBUG exceptionThrown = false; } finally { if (!exceptionThrown) // results are unreliable if an exception was thrown { if( visualsCreated ) { Debug.Assert( feContainer._buildVisualTreeVerification == VerificationState.WaitingForBuildVisualTreeCompletion, "A derived class overriding BuildVisualTree must call AddCustomTemplateRoot to attach its custom subtree before exiting."); } else { Debug.Assert( feContainer._buildVisualTreeVerification == VerificationState.WaitingForAddCustomTemplateRoot, "If a derived class overriding BuildVisualTree has called AddCustomTemplateRoot to attach its custom subtree, its BuildVisualTree must return true to indicate that it has done so."); } } // All done building this visual tree, stand by for the next one. feContainer._buildVisualTreeVerification = VerificationState.WaitingForBuildVisualTree; } #endif } } return visualsCreated; }