我正在使用Winforms将一个旧的VB6项目移植到C#。原始版本使用DataDynamic的ActiveBar套件同时管理工具栏,菜单和快捷方式色带中多个项目的更改。所有旧代码必须做的是更改多个菜单,工具栏和上下文菜单之间共享的项目的文本,更改“工具”对象的“标题”属性。
我觉得.NET 必须能够在各种容器之间共享ToolStripItem
,但看起来并不像。我错过了什么吗?
目前,我已经开始多次提出各种想法,在Clone
对象上实施ToolStripMenuItem
扩展方法,并让我的表单跟踪每个共享。当我意识到更新本地副本不会更新其他副本时我失败了(我必须添加复杂的更新事件,而不是简单地手动打开和关闭每个项目)。我考虑过根据标签创建一些更新所有项目的方法。这似乎也是不可行的。
在类似情况下,您使用了哪些技术?
答案 0 :(得分:3)
嗯,这实际上是.Net GUI-Building Libraries的烦人限制之一
常见的解决方法是动态管理菜单,在打开时向其添加项目。从用户体验的角度来看,丑陋但相当无缝。 诀窍是使用以下UI设计范例:菜单永远不会同时显示,因此您可以热插拔项目
private void myContextMenuStrip_Opening(object sender, CancelEventArgs e)
{
myContextMenuStrip.Items.Insert(3, myToolStripMenuItem);
}
然后使用标志和代码逻辑,您将能够知道,当菜单/工具栏/ ContextMenu被打开时,它应该显示哪些项目。
答案 1 :(得分:0)
我最终实现了SharedMenuItem
,其职责是注册和更新需要更改的UI元素。上下文菜单最终不同,足以保证自己的处理程序。
我没有更新所有的MenuItem,而是更新了SharedMenuItem
,然后处理了其他更改。
[编辑] 代码(添加其他属性甚至是微不足道的/自动生成的):
public class SharedMenuItem
{
bool enabled = false;
public bool Enabled
{
get { return enabled; }
set
{
enabled = value;
foreach (var member in members)
{
member.Enabled = value;
}
}
}
bool visible;
public bool Visible
{
get { return visible; }
set
{
visible = value;
foreach (var member in members)
{
member.Visible = visible;
}
}
}
string text;
public string Text
{
get { return text; }
set
{
text = value;
foreach (var member in members)
{
member.Text = text;
}
}
}
string toolTipText = "";
public string ToolTipText
{
get { return toolTipText; }
set
{
toolTipText = value;
foreach (var member in members)
{
member.ToolTipText = toolTipText;
}
}
}
private List<ToolStripItem> members = new List<ToolStripItem>();
public void Remove(ToolStripItem member)
{
members.Remove(member);
}
public void Add(ToolStripItem member)
{
members.Add(member);
}
public SharedMenuItem(string text)
{
this.text = text;
}
}