[英]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 Framework
, AnyCPU
配置文件。
▶ 添加對[Visual Studio install Path]\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.DebuggerVisualizers.dll
和System.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.