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.
+4
A:
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);
}
}
Lars Kemmann
2010-05-14 21:56:09