【问题标题】:Debugger Visualizer Winform ToolStripDropDownMenu ComboBox only shows items when first shownDebugger Visualizer Winform ToolStripDropDownMenu ComboBox 仅在首次显示时显示项目
【发布时间】:2020-05-08 09:12:20
【问题描述】:

我有一个 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 中添加 ToolStripComboBox 似乎是个问题。

  • 如果我在控制台应用程序中创建并打开同一个表单类的多个实例,它可以正常工作。

  • 一旦出现问题,它继续发生 - 即使我将代码恢复到没有ToolStripDropDown的版本

  • 如果我重新启动 Visual Studio,它会在第一次显示表单时工作,然后就不行了。

有什么想法吗?!任何人都知道IDialogVisualizerService 处理控件或其他东西的方式有些皱纹?!

感谢阅读:)

【问题讨论】:

    标签: c# winforms combobox debuggervisualizer toolstripdropdown


    【解决方案1】:

    似乎,当调试器可视化器关闭时 - 这是在调试器端处理的,而不是在被调试端处理的 - DropDown 被破坏但ToolStripManager 不知道它,它发现自己有一个无效的处理它不知道如何管理的问题。

    由于 ToolStripManager 在设计模式下也处于活动状态,这会将问题传播到整个设计器界面:您可能会发现在调试器可视化工具关闭后某些 DropDown 项仍然有效,但您可能无法添加其他 ToolStripComboBox 项任何地方。
    如果您坚持,那些看似有效的方法也可能不再有效。

    请注意,这种不当行为可以转化为 ComboBox 对象;不是直接的,而是当您尝试通过界面访问他们的 Items 集合时。
    它还可能会阻止项目编译。

    显式处理在调试器可视化器端创建的 Form 对象,可以部分解决被调试者端的问题,但事实证明,在调试器可视化器端不能解决问题。

    一个简单的解决方案是避免设置 ToolStripMenuItem 的 DropDown 对象,而是使用 MenuStrip,将项目添加到 ToolStripDownDown。


    Create custom data visualizers
    Visualizer Security Considerations


    用于测试行为的示例调试器可视化器(简单图像可视化器)。

    ▶ 创建一个类库项目,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 目录中。

    ▶ 启动调试会话,在设置​​/加载图像/位图属性的位置添加断点,然后使用放大镜工具打开预览。

    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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2014-10-13
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多