Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF in an MMC snapin

Tags:

wpf

mmc

Can someone provide some sample code for using WPF in a custom MMC snapin? I'm new to WPF, and I've understood the samples for writing MMC snapins, but I do not understand how to choose WPF instead of Winforms.

like image 450
Jason Hocker Avatar asked Apr 25 '10 02:04

Jason Hocker


1 Answers

I've just spent the morning building this exact scenario for a project I'm working on. Here's the context-free version of the code:

/// <summary>
/// Defines a scope node with a default Forms view that will host a
/// WPF control.
/// </summary>
public class WPFScopeNode: ScopeNode
{
    /// <summary>
    /// Instantiates a new specialized scope node.
    /// </summary>
    public WPFScopeNode()
        : base()
    {
        this.DisplayName = "Name in tree view";

        // TODO: Create any child scope nodes, adding them to 'this.Children'.

        // Attach a forms view to this node that hosts a WPF control.
        var wpfFormView = new FormViewDescription
        {
            DisplayName = "Name of view",
            ControlType = typeof(WPFHostControl),
            ViewType = typeof(WPFHostFormView)
        };
        this.ViewDescriptions.Add(wpfFormView );
    }
}


/// <summary>
/// This class provides a model-interface for the hosted WPF control.
/// </summary>
public class WPFHostFormView : FormView
{
    public WPFHostFormView ()
    {
        this.DescriptionBarText = "WPF Host View";
    }

    /// <summary>
    /// Defines the structure of the form view.
    /// </summary>
    /// <param name="status"></param>
    protected override void OnInitialize(AsyncStatus status)
    {
        base.OnInitialize(status);

        // TODO: This may be a good place to pass 'this.Control' the
        // data context that will be used for databinding by the WPF
        // control.  Note that 'this.Control' is the Windows Forms
        // UserControl that contains an ElementHost which, in turn,
        // hosts the WPF UserControl of interest.
    }
}


/// <summary>
/// Defines a Windows Forms control that hosts a specific WPF UserControl.
/// Note the logic for automatic resizing to the parent surface in the
/// MMC MDI interface.
/// Also, 'MyWPFUserControl' is just a standard WPF
/// UserControl; nothing special needs to be done there for MMC integration.
/// </summary>
public partial class WPFHostControl : UserControl
{
    // TODO: Expose a method for setting the DataContext of the hosted element!

    public WPFHostControl ()
    {
        InitializeComponent();

        ParentChanged += new EventHandler(WPFHostControl_ParentChanged);
    }

    void WPFHostControl_ParentChanged(object sender, EventArgs e)
    {
        if (Parent != null)
        {
            Size = Parent.ClientSize;
            Parent.ClientSizeChanged +=
                new EventHandler(Parent_ClientSizeChanged);
        }
    }

    void Parent_ClientSizeChanged(object sender, EventArgs e)
    {
        if (Parent != null)
        {
            Size = Parent.ClientSize;
        }
    }

    private MyWPFUserControl hostedControl;
    private System.Windows.Forms.Integration.ElementHost elementHost;

    /// <remarks>
    /// To make the Visual Studio designer work smoothly, you could
    /// split this function into a *.designer.cs file using a partial
    /// class definition.
    /// </remarks>
    private void InitializeComponent()
    {
        this.elementHost = new System.Windows.Forms.Integration.ElementHost();
        this.hostedControl = new MyWPFUserControl();
        this.SuspendLayout();
        // 
        // elementHost
        // 
        this.elementHost.Dock = System.Windows.Forms.DockStyle.Fill;
        this.elementHost.Location = new System.Drawing.Point(0, 0);
        this.elementHost.Name = "elementHost";
        this.elementHost.Size = new System.Drawing.Size(150, 150);
        this.elementHost.TabIndex = 0;
        this.elementHost.Child = this.hostedControl;
        // 
        // EnvironmentDashboard
        // 
        this.Controls.Add(this.elementHost);
        this.Name = "WPF Host View";
        this.ResumeLayout(false);

    }
}
like image 136
Lars Kemmann Avatar answered Sep 30 '22 04:09

Lars Kemmann