/// <summary>
        /// Return the template to use.  This may depend on the Content, or
        /// other properties.
        /// </summary>
        /// <remarks>
        /// The base class implements the following rules:
        ///   (a) If ContentTemplate is set, use it.
        ///   (b) If ContentTemplateSelector is set, call its
        ///         SelectTemplate method.  If the result is not null, use it.
        ///   (c) Look for a DataTemplate whose DataType matches the
        ///         Content among the resources known to the ContentPresenter
        ///         (including application, theme, and system resources).
        ///         If one is found, use it.
        ///   (d) If the type of Content is "common", use a standard template.
        ///         The common types are String, XmlNode, UIElement.
        ///   (e) Otherwise, use a default template that essentially converts
        ///         Content to a string and displays it in a TextBlock.
        /// Derived classes can override these rules and implement their own.
        /// </remarks>
        protected virtual DataTemplate ChooseTemplate()
        {
            DataTemplate template = null;
            object       content  = Content;

            // ContentTemplate has first stab
            template = ContentTemplate;

            // no ContentTemplate set, try ContentTemplateSelector
            if (template == null)
            {
                if (ContentTemplateSelector != null)
                {
                    template = ContentTemplateSelector.SelectTemplate(content, this);
                }
            }

            // if that failed, try the default TemplateSelector
            if (template == null)
            {
                template = DefaultTemplateSelector.SelectTemplate(content, this);
            }

            return(template);
        }
Exemple #2
0
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            base.OnContentChanged(oldContent, newContent);
            if (newContent is UIElement)
            {
                return;
            }
            if (newContent == null)
            {
                ContentTemplate = null;
                return;
            }
            if (oldContent == null && ContentTemplate != null)
            {
                return;
            }
            if (ContentTemplateSelector != null)
            {
                ContentTemplate = ContentTemplateSelector.SelectTemplate(newContent, this);
                return;
            }

            var key = GetKey(newContent);

            ContentTemplate = (DataTemplate)Application.Current.Resources[key];
        }
Exemple #3
0
        private IFrameworkTemplate FindTemplate()
        {
            if (Content == null)
            {
                return(null);
            }

            if (Content is UIElement)
            {
                return(Template is UIElementTemplate && ((UIElementTemplate)Template).Content == Content ? Template : new UIElementTemplate((UIElement)Content));
            }

            if (ContentTemplate != null)
            {
                return(ContentTemplate);
            }

            if (ContentTemplateSelector != null)
            {
                ContentTemplateSelector.SelectTemplate(Content, this);
            }

            DataTemplate dataTemplate;

            if (TryFindDataTemplate(Content.GetType(), out dataTemplate))
            {
                return(dataTemplate);
            }

            return(DefaultContentTemplate.Default);
        }
        private void StartTransition(object oldContent, object newContent)
        {
            // both presenters must be available, otherwise a transition is useless.
            if (CurrentContentPresentationSite != null && PreviousContentPresentationSite != null)
            {
                if (RestartTransitionOnContentChange)
                {
                    CurrentTransition.Completed -= OnTransitionCompleted;
                }

                if (ContentTemplateSelector != null)
                {
                    PreviousContentPresentationSite.ContentTemplate = ContentTemplateSelector.SelectTemplate(oldContent, this);
                    CurrentContentPresentationSite.ContentTemplate  = ContentTemplateSelector.SelectTemplate(newContent, this);
                }

                CurrentContentPresentationSite.Content  = newContent;
                PreviousContentPresentationSite.Content = oldContent;

                // and start a new transition
                if (!IsTransitioning || RestartTransitionOnContentChange)
                {
                    if (RestartTransitionOnContentChange)
                    {
                        CurrentTransition.Completed += OnTransitionCompleted;
                    }
                    IsTransitioning = true;
                    VisualStateManager.GoToState(this, NormalState, false);
                    VisualStateManager.GoToState(this, GetTransitionName(Transition), true);
                }
            }
        }
        public override void OnApplyTemplate()
        {
            if (IsTransitioning)
            {
                AbortTransition();
            }

            if (CustomVisualStates != null && CustomVisualStates.Any())
            {
                var presentationGroup = VisualStates.TryGetVisualStateGroup(this, PresentationGroup);
                if (presentationGroup != null)
                {
                    foreach (var state in CustomVisualStates)
                    {
                        presentationGroup.States.Add(state);
                    }
                }
            }

            base.OnApplyTemplate();

            PreviousContentPresentationSite =
                GetTemplateChild(PreviousContentPresentationSitePartName) as ContentPresenter;
            CurrentContentPresentationSite =
                GetTemplateChild(CurrentContentPresentationSitePartName) as ContentPresenter;

            if (CurrentContentPresentationSite != null)
            {
                if (ContentTemplateSelector != null)
                {
                    CurrentContentPresentationSite.ContentTemplate = ContentTemplateSelector.SelectTemplate(Content,
                                                                                                            this);
                }
                else
                {
                    CurrentContentPresentationSite.ContentTemplate = ContentTemplate;
                }

                CurrentContentPresentationSite.Content = Content;
            }

            // hookup currenttransition
            var transition = GetStoryboard(Transition);

            CurrentTransition = transition;
            if (transition == null)
            {
                var invalidTransition = Transition;
                // revert to default
                Transition = DefaultTransitionState;

                throw new Exception(string.Format("'{0}' Transition could not be found!", invalidTransition));
            }
            VisualStateManager.GoToState(this, NormalState, false);
        }
        private void EnsureTemplate()
        {
            DataTemplate template = ContentTemplate;

            if (template == null)
            {
                if (ContentTemplateSelector != null)
                {
                    template = ContentTemplateSelector.SelectTemplate(Content, this);
                }
            }

            ActualContentTemplate = template;
        }
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
        {
            base.PrepareContainerForItemOverride(element, item);
            var item2 = element as TileViewItem;

            if (item2 != null)
            {
                item2.ParentTileView = this;

                Dictionary <int, TileViewItem> orderedContainers = GetOrderedContainers();
                if (!orderedContainers.ContainsKey(orderedContainers.Count))
                {
                    orderedContainers.Add(orderedContainers.Count, item2);
                }
                AttachItemContainerEventHandlers(item2);
                AssignItemContainersToCells(orderedContainers);
                UpdateItemsSizeAndPosition();
                if ((MaximizeMode == TileViewMaximizeMode.One) && IsItemMaximizedByDefault(item2))
                {
                    item2.SizeChanged += MaximizedContainerSizeChanged;
                    if (item2.TileState == TileViewItemState.Maximized)
                    {
                        HandleTileViewItemMaximized(item2);
                    }
                    else
                    {
                        item2.TileState = TileViewItemState.Maximized;
                    }
                }
                if ((MaximizedItem != null) && (MaximizedItem != item))
                {
                    item2.TileState = TileViewItemState.Minimized;
                }
                if (item2.ContentTemplate == null)
                {
                    if (ContentTemplate != null)
                    {
                        item2.ContentTemplate = ContentTemplate;
                    }
                    else if (ContentTemplateSelector != null)
                    {
                        item2.ContentTemplate = ContentTemplateSelector.SelectTemplate(item, item2);
                    }
                }
            }

            UpdateItemsLayout();
        }
        /// <summary>
        ///     Called when the value of the <see cref="P:System.Windows.Controls.ContentControl.Content" /> property changes.
        /// </summary>
        /// <param name="oldContent">The old value of the <see cref="P:System.Windows.Controls.ContentControl.Content" /> property.</param>
        /// <param name="newContent">The new value of the <see cref="P:System.Windows.Controls.ContentControl.Content" /> property.</param>
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            ContentPresenter currentContentPresentationSite = TransitioningContentControlEx._currentContentPresentationSiteGetter(this);

            if (ContentTemplateSelector != null)
            {
                ContentPresenter previousContentPresentationSite = TransitioningContentControlEx._previousContentPresentationSiteGetter(this);

                if (previousContentPresentationSite == null || currentContentPresentationSite == null)
                {
                    return;
                }
                previousContentPresentationSite.ContentTemplate = ContentTemplateSelector.SelectTemplate(
                    oldContent, this);
                currentContentPresentationSite.ContentTemplate = ContentTemplateSelector.SelectTemplate(newContent, this);
            }
            base.OnContentChanged(oldContent, newContent);
        }