Frage

Ich habe vor einem Datenbank-Projekt lang einen Bericht Formular-Designer geschrieben habe. Es verwendet eine Menge winapi Magie daher war ich gezwungen, einige Teile ‚in geeigneter Weise‘ neu zu schreiben.

Dank einiger Artikel von MSDN Magazin ( hier und < a href = "http://msdn.microsoft.com/en-us/magazine/cc163634.aspx" rel = "nofollow noreferrer"> hier ) und Codeproject konnte ich Designer-Oberfläche, Werkzeugkasten und Undo / Redo-Motor.

implementieren
  1. Jede Ressource i zu dem Thema bisher entdeckt wurde, ist ein wenig veraltet. Können Sie sich an den frischen / umfassenden Artikel verweisen?

  2. -Code von Artikel oben erwähnt, scheint nicht funktioniert .

    MenuCommandService.ShowContextMenu heißt aber nichts erscheint, da es keine DesignerVerbs in globalVerbs Sammlung ist. Soll ich ‚Standard‘ diejenigen hinzufügen, entsprechen Designer Aktionen wie Ausschneiden / Einfügen, manuell? Wenn ja, wie kann ich das erreichen?

War es hilfreich?

Lösung

Dank SharpDevelop Quellen konnte ich die Lösung, um herauszufinden,

Diese minimale Implementierung (einige standart Befehle, nicht mehr) arbeitete für mich

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

    }
}

Aktualisieren

ähnliche Lösung

Andere Tipps

lief ich in gleiches Problem vor einem Monat und bekam etwas wirklich interessante und hilfreiche von CodePlex hier . Ich las über diese auf Brad Abrams Blog Post. Dazu gehört viele Beispiele zum Rahmen Erweiterbarkeit und benutzerdefinierten Windows Form-Designer-Schnittstelle ist einer von ihnen.

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

Link Txt 2: http://blogs.msdn.com/brada/archive/2009/04/13/managed-extensibility-framework-preview-5-released.aspx

Danke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top