Click here to Skip to main content
15,891,529 members
Articles / Desktop Programming / WPF

XPlorerBar : Part 2 - Adding design-time support to the WPF explorer bar control

Rate me:
Please Sign up or sign in to vote.
4.98/5 (50 votes)
22 Dec 2008CPOL14 min read 96.3K   2.7K   109  
This library provides Visual Studio 2008 design-time support to customize WPF XPlorerBar features.
#region [       Copyright © 2008, Zona-Tools, all rights reserved.       ]
/*
 * 
    This source code is licensed under the Code Project Open License (CPOL).
    Check out http://www.codeproject.com/info/cpol10.aspx for further details.
 * 
*/
#endregion


#region [       Using namespaces       ]

using System;
using System.Windows;
using Microsoft.Windows.Design.Interaction;
using Microsoft.Windows.Design.Model;

#endregion


namespace ZonaTools.XPlorerBar.VisualStudio.Design
{
    /// <summary>
    /// Provides an adorner on any selected XPlorerBar object.
    /// </summary>
    public class XPlorerBarAdornerProvider : PrimarySelectionAdornerProvider
    {
        #region [       Fields       ]

        //ModelItem representation of the selected control
        private ModelItem m_adornedControlModel;
        //Adorner look and feel
        private DesignTimeGlyph m_designTimeGlyph;
        //Panel that holds design-time adorners
        private AdornerPanel m_xplorerBarAdornerPanel;

        #endregion


        #region [       Properties       ]

        /// <summary>
        /// Public accessor of the panel that holds the design-time adorners
        /// </summary>
        public AdornerPanel Panel
        {
            get
            {
                //If the panel does not exist
                if (this.m_xplorerBarAdornerPanel == null)
                {
                    //Creates it
                    m_xplorerBarAdornerPanel = new AdornerPanel();
                    m_xplorerBarAdornerPanel.Children.Add(m_designTimeGlyph);

                    //and adds it to the adorners collection
                    this.Adorners.Add(m_xplorerBarAdornerPanel);
                }
                return m_xplorerBarAdornerPanel;
            }
        }

        #endregion


        #region [       Constructor       ]

        //===========================================================================
        /// <summary>
        /// Default constructor.
        /// </summary>
        //===========================================================================
        public XPlorerBarAdornerProvider()
        {
            //Creates a design-time glyph
            m_designTimeGlyph = new DesignTimeGlyph();
        }

        #endregion


        #region [       Creates and sets up the panel that holds the adorners       ]

        //===========================================================================
        /// <summary>
        /// Creates an <c>AdornerPanel</c> to host controls, which act as adorners 
        /// for the selected control, sets up the panel and attaches a 
        /// <c>ModelItem</c> to the adorned control.
        /// </summary>
        /// <param name="item">A <c>ModelItem</c> representing the adorned element.
        /// </param>
        /// <param name="view">An instance of the adorned element.</param>
        //===========================================================================
        protected override void Activate(ModelItem item, DependencyObject view)
        {
            //Saves the ModelItem (adorned element) and handles its changes
            m_adornedControlModel = item;
            m_adornedControlModel.PropertyChanged += 
                new System.ComponentModel.PropertyChangedEventHandler(m_adornedControlModel_PropertyChanged);

            //Gets the adorner panel
            AdornerPanel adornerPanel = this.Panel;

            //Sets the size of the design-time glyph
            AdornerPanel.SetHorizontalStretch(m_designTimeGlyph, AdornerStretch.Scale);
            AdornerPanel.SetVerticalStretch(m_designTimeGlyph, AdornerStretch.Scale);

            //Sets the placement of the design-time glyph within the adorner panel
            AdornerPlacementCollection placement = new AdornerPlacementCollection();
            placement.SizeRelativeToAdornerDesiredWidth(1.0, 0.0);
            placement.SizeRelativeToAdornerDesiredHeight(1.0, 0.0);
            placement.PositionRelativeToAdornerHeight(-1.0, 0.0);
            placement.PositionRelativeToContentWidth(1.0, -17.0);
            AdornerPanel.SetPlacements(m_designTimeGlyph, placement);

            base.Activate(item, view);
        }


        //===========================================================================
        /// <summary>
        /// Used to update the adorners each time the adorned element changed.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">A <c>PropertyChangedEventArgs</c> that contains the 
        /// event data.</param>
        //===========================================================================
        void m_adornedControlModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            //Not used here
        }

        #endregion
    }
}
 

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Team Leader
France France
I have been developing and managing projects for real-time embedded softwares for eight years. Then, I moved from Paris to the south of France and began to lead a team who was developping Java applications.

My main occupation right now is to continue my journey in the WPF world.

You can check out my blog here. [^]

Comments and Discussions