2009-05-20 25 views
3

私はずっと前にデータベースプロジェクトのために書かれたレポートフォームデザイナーを持っています。それは、私は適切な方法でいくつかの部分を書き換えることを余儀なくされたので、winapiの魔法の多くを使用しました。.NETカスタムフォームデザイナ:IMenuCommandServiceの実装方法?

MSDNマガジン(hereおよびhere)のいくつかの記事とCodeProjectのおかげで、私はデザイナサーフェス、ツールボックス、アンドゥ/リドゥエンジンを実装できました。

  1. これまでのトピックで発見したリソースはすべて古くなっています。新鮮な/包括的な記事を指すことができますか?

  2. 上記のコードarticleは機能していないようです。

    globalVerbsコレクションにDesignerVerbsがないため、MenuCommandService.ShowContextMenuが呼び出されますが、何も表示されません。手動で切り取り/貼り付けなどのデザイナーの操作に対応した標準のものを追加する必要がありますか?はいの場合、これをどのように達成できますか?

+1

この分野では、これまでにどんな良い文書も見たことがありません。コントロールのためのデザイナーの作成に関する情報ですが、フォーム全体ではありません。私はあなたがReflector、または共有ソースを使ってソースを見るのに時間を費やすことをお勧めします。 –

答えて

3

おかげで私は(これ以上、いくつかのスタンダール・コマンド)ソリューション

この最小限の実装を把握することができませんでした私のため

similar solutionを見つけ

using System; 
using System.Collections.Generic; 
using System.ComponentModel.Design; 
using System.Diagnostics; 
using System.Windows.Forms; 
using System.Drawing; 

namespace DesignerHost 
{ 
    class MenuCommandServiceImpl : MenuCommandService 
    { 
     DesignerVerbCollection m_globalVerbs = new DesignerVerbCollection(); 

     public MenuCommandServiceImpl(IServiceProvider serviceProvider) 
      : base(serviceProvider) 
     { 
      m_globalVerbs.Add(StandartVerb("Cut", StandardCommands.Cut)); 
      m_globalVerbs.Add(StandartVerb("Copy", StandardCommands.Copy)); 
      m_globalVerbs.Add(StandartVerb("Paste", StandardCommands.Paste)); 
      m_globalVerbs.Add(StandartVerb("Delete", StandardCommands.Delete)); 
      m_globalVerbs.Add(StandartVerb("Select All", StandardCommands.SelectAll)); 

     } 

     private DesignerVerb StandartVerb(string text, CommandID commandID) 
     { 
      return new DesignerVerb(text, 
       delegate(object o, EventArgs e) 
       { 
        IMenuCommandService ms = 
         GetService(typeof(IMenuCommandService)) as IMenuCommandService; 
        Debug.Assert(ms != null); 
        ms.GlobalInvoke(commandID); 
       } 
      ); 
     } 

     class MenuItem : ToolStripMenuItem 
     { 
      DesignerVerb verb; 

      public MenuItem(DesignerVerb verb) 
       : base(verb.Text) 
      { 
       Enabled = verb.Enabled; 
       this.verb = verb; 
       Click += InvokeCommand; 
      } 

      void InvokeCommand(object sender, EventArgs e) 
      { 
       try 
       { 
        verb.Invoke(); 
       } 
       catch (Exception ex) 
       { 
        Trace.Write("MenuCommandServiceImpl: " + ex.ToString()); 
       } 
      } 
     } 

     private ToolStripItem[] BuildMenuItems() 
     { 
      List<ToolStripItem> items = new List<ToolStripItem>(); 

      foreach (DesignerVerb verb in m_globalVerbs) 
      { 
       items.Add(new MenuItem(verb)); 
      } 
      return items.ToArray(); 
     } 

     #region IMenuCommandService Members 

     /// This is called whenever the user right-clicks on a designer. 
     public override void ShowContextMenu(CommandID menuID, int x, int y) 
     { 
      // Display our ContextMenu! Note that the coordinate parameters to this method 
      // are in screen coordinates, so we've got to translate them into client coordinates. 

      ContextMenuStrip cm = new ContextMenuStrip(); 
      cm.Items.AddRange(BuildMenuItems()); 

      ISelectionService ss = GetService(typeof (ISelectionService)) as ISelectionService; 
      Debug.Assert(ss != null); 

      Control ps = ss.PrimarySelection as Control; 
      Debug.Assert(ps != null); 

      Point s = ps.PointToScreen(new Point(0, 0)); 
      cm.Show(ps, new Point(x - s.X, y - s.Y)); 
     } 

     #endregion 

    } 
} 

アップデートを働きました

+1

は、私が知っているこのMSDNコードに基づいています どうやらMEFスタジオのデザイナーここには、作業の設計表面のコンテキストメニューがありますが、後半にされていません"似たような解決策"には問題があります。そこでは、メニューをクリックすると、GlobalInvoke(designerVerb.CommandID)を使って動詞が呼び出されます。同じCommandIDを共有する動詞があります(つまり、タブストリップからタブを追加したり削除したりすると、すべての条件で同様の解決策が機能しません。ここでは、メニューをクリックすると、機能するdesignerVerb.Invoke() 。 – bubi

1

私はヶ月前に同じ問題に遭遇したとのCodePlex hereから本当にのinterstingと便利なものを得ました。私はこれについてBrad Abram's Blogポストで読む。これらには、フレームワークの拡張性に関する多くの例が含まれており、カスタムWindowsフォームデザイナインターフェイスもその1つです。

リンクtxtが1:http://mef.codeplex.com/

リンクtxtが2:http://blogs.msdn.com/brada/archive/2009/04/13/managed-extensibility-framework-preview-5-released.aspx

感謝。 SharpDevelopのソースへ

+0

http://msdn.microsoft.com/en-us/magazine/cc163634.aspx – jonny