5

私は現在、エンドユーザーが実行時にコントロールを追加/削除/移動できるデザインサーフェスを設計するプロジェクトに取り組んでいます。

私はこのチュートリアル「TimDawsonによるWindowsフォームデザイナのホスティング」に従い、必要なすべての機能をほぼ実装しました。

チュートリアルを読みたくない人のための短編小説:、、、、およびその他のインターフェイスを実装IDesignerHostIContainer、主に、本当にカスタムのデザインサーフェスが必要なため、フレームワークではすでに使用していませんISelectionServiceIToolboxServiceSystem.ComponentModel.Design.DesignSurface

質問 :

ユーザーが新しいControlをからにドラッグアンドドロップできるようにしIToolboxServiceたいIDesignerHost/IContainer。このチュートリアルでControlは、ツールボックスでクリックし、デザインサーフェスをクリックしてコントロールを追加します。

私が見つけたもの:

  • IToolboxServiceからへ のドラッグアンドドロップを自動的に行う組み込み機能がありますが System.ComponentModel.Design.DesignSurface、何もないところからIDesignerHostを実装すると、明らかに機能しません。
  • このメソッドを使用する場合 Control.DoDragDrop(ToolboxItem) 、ドラッグアンドドロップを開始するには:

    1. IToolboxService.SerializeToolboxItem(ToolboxItem) アイテムをシリアル化するために呼び出されます
    2. IToolboxService.IsToolboxItem(object) シリアル化された ToolboxItemをデザインサーフェスにドロップできる
      IToolboxService.IsSupported(object) かどうかを評価するために呼び出されます
    3. コントロールをドロップすると:コントロールドロップIToolboxService.DeserializeToolboxItem(object serializedObject)を逆シリアル化するためにデザインサーフェスによって呼び出されます。
  • IToolboxService.SetCursor()カスタムカーソルを定義するか、標準ウィンドウカーソルを使用するかを知るために呼び出されます。

問題 :

上記のすべてを「見つけたもの」に実装しましたが、ドラッグアンドドロップにはバグがあります。

  • ドラッグしても問題ありませんが、デザインサーフェスにカーソルを合わせると、標準カーソルと" DragDropEffects.Copy"スタイルの間でカーソルが少し点滅します。
  • ドロップしても何も起こらず、カーソルがデザインサーフェスを離れると(ドロップした後)、新しいControlものが作成され、ドロップした場所に追加されます。

誰かが私がやっていることをやろうとしたことがありますか?もしそうなら、どのようにそれを管理しましたか?ポインタ/リンク/良いアドバイスを持っている人はいますか?

ありがとう=)

4

2 に答える 2

3

ポインタ/リンク/良いアドバイスを持っている人はいますか?

この問題は、MicrosoftConnectの問題である2.0Designersで消費された/発生しなかったマウスイベントによって解決されたようです。この問題はほとんど理解しやすいですが、.NET Framework 1.1(2003)から2.0(2006)へのアップグレードは、ドラッグアンドドロップの動作の変更を意味しているようです-あなたが言及した記事が2003年からのものであることを考えると、これは関連している可能性があります。具体的には、セクションIssue 2、引用までスクロールする必要があります。

フォーム上をドラッグすると、常にちらつきが発生します。これは、2.0の新しいドラッグドロップ動作が部分的に原因です。

今のところ、これを深く掘り下げることはできませんが、Visual Studioバージョン2003と2005の間で変更されたドラッグアンドドロップの動作に対処する、Designerの[ドラッグアンドドロップのカスタマイズ]から何かを理解できるかもしれません。これは関連している可能性が非常に高く、受け入れられた回答の1つは、実際には上記のMicrosoft Connectの問題を具体的に参照しています。さらに、考えられる解決策についてのヒントも提供しています。

于 2009-09-22T03:21:47.770 に答える
0

私は1日前にこの質問に取り組みました。これはあなたのような私のプロジェクトのために見つけた私の解決策です。

  1. ドラッグしても問題ありませんが、デザインサーフェスにカーソルを合わせると、標準カーソルと「DragDropEffects.Copy」スタイルの間でカーソルが少し点滅します。

これは私のツールボックスサービスです。

class EasyAccordionToolboxService : AccordionControl, IToolboxService
{
    EasyAccordionControlElement _SelectedElement;
    public Control DesignPanel { get; set; }

    public EasyAccordionToolboxService()
    {
        AddAccordions();
        AllowItemSelection = true;
        base.ElementClick += EasyAccordionToolboxService_ElementClick;
    }

    private void EasyAccordionToolboxService_ElementClick(object sender, ElementClickEventArgs e)
    {
        if (e.Element.Level == 1) this._SelectedElement = e.Element as EasyAccordionControlElement;
    }

    public ToolboxItem GetSelectedToolboxItem()
    {
        if(_SelectedElement != null)
        {
            var selectedToolboxItem = this._SelectedElement.ToolBoxItem;
            this._SelectedElement = null;
            return selectedToolboxItem;
        }
        else
        {
            return null;
        }
    }

        public bool SetCursor()
    {
        if(this._SelectedElement == null)
        {
            this.DesignPanel.Cursor = Cursors.Default;
        }
        else
        {
            this.DesignPanel.Cursor = Cursors.Hand;
        }

        return true;
    }

「DesignPanel」プロパティと「SetCursor」メソッドがあります。DesignPanelプロパティは、ルートデザイナのビューを参照するコントロールです。

  1. ドロップしても何も起こらず、カーソルがデザインサーフェスを離れると(ドロップした後)、新しいコントロールが作成され、ドロップした場所に追加されます。

EasyAccordionToolBoxServiceにはIToolboxServiceから実装されたGetSelectedToolboxItemメソッドがあります。GetSelectedToolboxItemがあなたの答えです。

ついに、

        designer = new EasyDesignSurface(propertyGrid);

        var rootForm = (Form)designer.CreateComponent(typeof(Form));
        rootForm.Name = "rootForm";
        rootForm.Text = "BELGE";
        rootForm.TopLevel = false;
        rootForm.Size = new Size(600, 600);
        designer.ComponentContainer.Add(rootForm);

        var view = (Control)designer.View;
        view.Dock = DockStyle.Fill;
        designPanel.Controls.Add(view);

        easyAccordionToolboxService1.DesignPanel = view;
        designer.AddService(typeof(IToolboxService), easyAccordionToolboxService1);
于 2019-03-19T11:31:43.210 に答える