3

私はずっと前にデータベースプロジェクトのために書かれたレポートフォームデザイナーを持っています。それは多くのwinapiマジックを使用したので、私はいくつかの部分を「適切な方法で」書き直すことを余儀なくされました。

MSDNマガジン(ここここ)とCodeProjectのいくつかの記事のおかげで、デザイナーサーフェス、ツールボックス、元に/やり直しエンジンを実装できました。

  1. これまでのトピックで私が発見したすべてのリソースは少し時代遅れです。新鮮で包括的な記事を指摘できますか?

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

    MenuCommandService.ShowContextMenuが呼び出されますが、globalVerbsコレクションにDesignerVerbsがないため、何も表示されません。カット/ペーストなどのデザイナーアクションに対応する「標準」のものを手動で追加する必要がありますか?はいの場合、どうすればこれを達成できますか?

4

2 に答える 2

3

SharpDevelopのソースのおかげで、解決策を見つけることができました

この最小限の実装(一部の標準コマンド、それ以上)は私のために機能しました

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

    }
}

アップデート

同様の解決策が見つかりました

于 2009-05-26T16:18:53.787 に答える
1

私は1か月前に同じ問題に遭遇し、ここでCodePlexから本当に興味深く役立つものを手に入れました。これについては、BradAbramのブログ投稿で読みました。これらには、フレームワークの拡張性に関する多くの例が含まれており、カスタムWindowsフォームデザイナーインターフェイスはその1つです。

リンクテキスト1:http: //mef.codeplex.com/

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

ありがとう。

于 2009-05-21T18:03:26.927 に答える