簡體   English   中英

Debugger Visualizer Winform ToolStripDropDownMenu ComboBox 僅在首次顯示時顯示項目

[英]Debugger Visualizer Winform ToolStripDropDownMenu ComboBox only shows items when first shown

我有一個 Visual Studio 調試器可視化項目,當我將ToolStripComboBox添加到ToolStripDropDownMenu時,組合框的項目僅在第一次顯示表單時出現。

像這樣:

在此處輸入圖像描述

顯示問題的最基本版本的 winform 代碼如下:

public class MyVisualizerDialog : Form
{
    public MyVisualizerDialog()
    {
        var toolStripComboBox = new ToolStripComboBox
        {
            Items = { "One", "Two", "Three" }
        };

        var toolStripDownDown = new ToolStripDropDownMenu
        {
            Items = { toolStripComboBox }
        };

        var toolStrip = new ToolStrip
        {
            Items =
            {
                new ToolStripMenuItem("Options")
                {
                    DropDown = toolStripDownDown
                }
            }
        };

        Controls.Add(toolStrip);
    }
}

然后可視化代碼很簡單:

public class MyVisualizer : DialogDebuggerVisualizer
{
    protected override void Show(
        IDialogVisualizerService windowService,
        IVisualizerObjectProvider objectProvider)
    {
        windowService.ShowDialog(
            new MyVisualizerDialog());
    }
}

一些額外的細節:

  • 如果我將ToolStripComboBox添加到ToolStripMenuItem.DropDownItems ,它工作正常 - 這似乎是在ToolStripComboBox中有ToolStripDropDown的問題。

  • 如果我在控制台應用程序中創建並打開相同表單 class 的多個實例,它工作正常。

  • 一旦問題發生,它就會繼續發生 - 即使我將代碼恢復到沒有ToolStripDropDown的版本

  • 如果我重新啟動 Visual Studio,它會在第一次顯示表單時工作,然后就不行了。

有任何想法嗎?! 任何人都知道IDialogVisualizerService處理控件或其他東西的方式有些皺紋?!

謝謝閱讀:)

看起來,當調試器可視化器關閉時——在調試器端而不是在被調試端處理——DropDown 被破壞,但ToolStripManager不知道它,它發現自己有一個無效的句柄,它沒有t 知道如何管理。

由於 ToolStripManager 在設計模式下也處於活動狀態,這會將問題傳播到整個設計器界面:您可能會發現在調試器可視化工具關閉后某些 DropDown 項仍然有效,但您可能無法在任何地方添加其他 ToolStripComboBox 項。
如果你堅持,那些看起來工作的也可能不再工作。

請注意,這種不當行為可以轉化為 ComboBox 對象; 不是直接的,而是當您嘗試通過界面訪問他們的 Items 集合時。
它還可能會阻止項目編譯。

顯式處理在調試器可視化器端創建的表格 object 可以部分解決調試器端的問題,但事實證明,在調試器可視化器端不能解決問題。

一個簡單的解決方案是避免設置 ToolStripMenuItem 的 DropDown object 並改用 MenuStrip,將項目添加到 ToolStripDownDown。


創建自定義數據可視化工具
可視化器安全注意事項


示例調試器可視化器(簡單的圖像可視化器)來測試好的壞的行為。

▶ 創建 Class 庫項目, Target Framework設置為.Net FrameworkAnyCPU配置文件。

▶ 添加對[Visual Studio install Path]\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.DebuggerVisualizers.dllSystem.Windows.Forms的引用

▶ 將.dll編譯為Release

▶ 將 .dll 復制到當前 Visual Studio 安裝路徑的\Common7\Packages\Debugger\Visualizers目錄。

▶ 開始調試 session,在設置/加載圖像/位圖屬性的位置添加斷點,並使用放大鏡工具打開預覽。

using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.DebuggerVisualizers;

[assembly: DebuggerVisualizer(
    typeof(ImageVisualizer.DebuggerSide), 
    typeof(VisualizerObjectSource), Target = typeof(Image), Description = "Test Visualizer")]
namespace TestVisualizer
{
    public class DebuggerSide : DialogDebuggerVisualizer
    {
        override protected void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            var image = (Image)objectProvider.GetObject();
            var form = new Form();
            form.ClientSize = new Size(image.Width, image.Height);
            form.FormBorderStyle = FormBorderStyle.FixedSingle;
            form.SuspendLayout();

            // -------   WORKING CODE   ---------------
            var menuStrip = new MenuStrip() { };
            var tsComboBox = new ToolStripComboBox { Items = { "One", "Two", "Three" } };
            var toolStripDownDown = new ToolStripMenuItem() { Text = "Options" };
            toolStripDownDown.DropDownItems.AddRange(new ToolStripItem[] { tsComboBox });
            menuStrip.Items.AddRange(new ToolStripItem[] { toolStripDownDown });
            // -------   WORKING CODE   ---------------

            // -------   BAD CODE   ---------------
            //var toolStripComboBox = new ToolStripComboBox { Items = { "One", "Two", "Three" } };
            //var toolStripDownDown = new ToolStripDropDownMenu { Items = { toolStripComboBox } };
            //var toolStrip = new ToolStrip {
            //    Items = { new ToolStripMenuItem("Options") { DropDown = toolStripDownDown } }
            //};

            // -------   BAD CODE   ---------------

            var pBox = new PictureBox() { Image = image, Dock = DockStyle.Fill };

            //form.Controls.Add(toolStrip);
            form.Controls.Add(menuStrip);
            form.Controls.Add(pBox);
            form.MainMenuStrip = menuStrip;
            form.ResumeLayout(false);
            form.PerformLayout();

            windowService.ShowDialog(form);
            form?.Dispose();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM