.NET 사용자 정의 양식 디자이너 : ImenucommandService를 구현하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/888845

문제

데이터베이스 프로젝트를 위해 오래 전에 작성된 보고서 양식 디자이너가 있습니다. 그것은 많은 Winapi 마술을 사용했기 때문에 일부 부품을 '적절한 방식으로'다시 작성해야했습니다.

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

  1. 지금까지 주제에 대해 내가 발견 한 모든 자원은 약간 구식입니다. 신선한/포괄적 인 기사를 가리킬 수 있습니까?

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

    MenucommandService.showContextMenu는 호출되지만 GlobalVerbs Collection에는 DesignerVerbs가 없기 때문에 아무것도 나타나지 않습니다. '표준'을 추가해야하며, 컷/페이스트와 같은 디자이너 동작에 해당해야합니까? 그렇다면 어떻게 이걸 달성 할 수 있습니까?

도움이 되었습니까?

해결책

SharpDevelop 소스 덕분에 솔루션을 알아낼 수있었습니다.

이 최소한의 구현 (일부 standart 명령, 더 이상)은 나를 위해 일했습니다.

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

    }
}

업데이트

설립하다 유사한 솔루션

다른 팁

나는 한 달 전에 같은 문제를 겪고 CodePlex에서 정말로 intersting하고 도움이되는 것을 얻었습니다. 여기. 나는 이것에 대해 읽었다 브래드 아브람의 블로그 게시하다. 여기에는 프레임 워크 확장 가능성에 대한 많은 예가 포함되어 있으며 사용자 정의 Windows 양식 디자이너 인터페이스는 그 중 하나입니다.

링크 txt 1 : http://mef.codeplex.com/

링크 TXT 2 : http://blogs.msdn.com/brada/archive/2009/04/13/managed-extensibility-framework-preview-5-releident.aspx

감사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top