2009-05-20 2 views
3

나는 데이터베이스 프로젝트를 위해 오래 전에 작성된 보고서 양식 디자이너가있다. 그것은 많은 winapi 마법을 사용했기 때문에 나는 '적절한 방법으로'일부 부품을 다시 작성해야만했다..NET 사용자 지정 양식 디자이너 : IMenuCommandService를 구현하는 방법?

MSDN 잡지 (herehere) 및 CodeProject의 일부 기사 덕분에 디자이너 표면, 도구 상자 및 실행 취소/다시 실행 엔진을 구현할 수있었습니다.

  1. 지금까지 주제에서 발견 한 모든 리소스는 약간 구형입니다. 신선한/포괄적 인 기사를 가리킬 수 있습니까?

  2. 위에서 언급 한 코드 article이 작동하지 않는 것 같습니다.

    globalVerbs 컬렉션에 DesignerVerbs가 없으므로 MenuCommandService.ShowContextMenu가 호출되었지만 아무 것도 표시되지 않습니다. 수동으로 잘라 내기/붙여 넣기와 같은 디자이너 작업에 해당하는 '표준'항목을 추가해야합니까? 그렇다면 어떻게해야합니까?

+1

이 분야에서 좋은 문서를 본 적이 없습니다. 컨트롤에 대한 디자이너를 만드는 방법에 대한 정보. 예.하지만 전체 양식에는 포함되지 않습니다. Reflector 또는 공유 소스를 사용하여 소스를 보는 데 시간을 투자하는 것이 좋습니다. –

답변

3

덕분에 내가 (더 이상 일부의 standart 명령) 솔루션

이 최소한의 구현을 알아낼 수 없었다 나를 위해

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를 공유하는 동사가 있습니다 (즉, TabStrip에서 탭 추가 및 제거로 비슷한 솔루션이 모든 조건에서 작동하지 않습니다. 여기에서 메뉴 클릭시 수행 할 작업은 잘 작동하는 designerVerb.Invoke()를 사용하여 호출됩니다 . – bubi

1

한 달 전에 같은 문제가 발생하여 CodePlex here에서 정말 재미 있고 도움이되는 내용을 얻었습니다. 나는 이것에 관해 Brad Abram's Blog 포스트에서 읽었다. 여기에는 프레임 워크 확장 성 및 사용자 지정 Windows Form Designer Interface에 대한 많은 예제가 포함됩니다.

링크 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