.NET مصمم النموذج المخصص: كيفية تنفيذ imenucommandservice؟

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

سؤال

لدي مصمم نموذج تقرير مكتوب منذ فترة طويلة لمشروع قاعدة البيانات. استخدم الكثير من السحر Winapi، أجبرت على إعادة كتابة بعض الأجزاء "بطريقة سليمة".

بفضل بعض المقالات من مجلة MSDN (هنا و هنا) و CodeProject. كنت قادرا على تطبيق سطح مصمم، مربع الأدوات ومحرك التراجع / الإعادة.

  1. كل مورد اكتشفته على الموضوع حتى الآن قديم قليلا. هل يمكنك الإشارة إلى مقالة جديدة / شاملة؟

  2. رمز من شرط المذكورة أعلاه تبدو لا تعمل.

    يتم استدعاء menucommandservice.showcontextmenu ولكن لا شيء يبدو لأنه لا يوجد أي designerverbs في مجموعة gllobalverbs. يجب أن أضيف "قياسي"، يتوافق مع تصرفات المصمم مثل قطع / لصق، يدويا؟ إذا كانت الإجابة بنعم، كيف يمكنني تحقيق ذلك؟

هل كانت مفيدة؟

المحلول

بفضل مصادر Sharpdeveld تمكنت من معرفة الحل

هذا التنفيذ الأدنى (بعض أوامر ستاندارت، لا أكثر) عملت بالنسبة لي

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 هنا. وبعد قرأت عن هذا على بلوق براد أبرام بريد. تتضمن هذه العديد من الأمثلة على إمكانية التقييم الإطاري وواجهة مصمم نموذج Windows المخصصة هي واحدة منها.

Link TXT 1: http://mef.codeplex.com/

Link TXT 2: http://blogs.msdn.com/brada/archive/2009/04/13/managed-Extensivity-FrameWork-Preview-5-releader.aspx.

شكرا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top