2010-04-25 65 views
5

有人可以提供一些示例代碼來使用自定義MMC管理單元中的WPF?我是WPF的新手,我已經理解了用於編寫MMC snapins的示例,但我不明白如何選擇WPF而不是Winforms。在MMC管理單元中的WPF

回答

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); 

    } 
} 
相關問題