有人可以提供一些示例代码,以便在自定义MMC管理单元中使用WPF吗?我是WPF的新手,我已经理解了编写MMC snapins的示例,但我不明白如何选择WPF而不是Winforms。
答案 0 :(得分:10)
我刚刚花了一个上午为我正在进行的项目构建这个确切的场景。这是代码的无上下文版本:
/// <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);
}
}