有没有办法在菜单和工具栏之间共享ToolStripMenuItem?
我正在使用Winforms将旧的VB6项目移植到C#。原始使用DataDynamic的ActiveBar套件同时管理工具栏,菜单和快捷功能区中的多个项目的更改。所有的旧代码都必须改变在几个菜单,工具栏和上下文菜单之间共享的项目的文本是改变“工具”对象的“标题”属性。有没有办法在菜单和工具栏之间共享ToolStripMenuItem?
我觉得像.NET 必须有不同容器之间共享ToolStripItem
s的方式,但它看起来并不像。我错过了什么吗?
目前我已经有各种想法多次启动,从ToolStripMenuItem
对象实施Clone
扩展方法,并有我的形式跟踪每个共享的。当我意识到更新本地副本不会更新其他人时(我不得不添加更复杂的更新事件,而不是简单地手动打开和关闭每个项目),失败了。我考虑过创建一些基于标签来更新所有项目的方法。这似乎也是不可行的。
你们都在类似的情况下使用过什么技术?
好吧,这其实是净GUI构建库
一种常见的解决方法是动态地管理你的菜单的烦人的限制之一,将项目添加到他们,因为他们正在打开。从用户体验的角度来看,它很难但很完美。 诀窍是使用下面的UI设计pradigm:菜单从不同时显示,这样你就可以使用标志和代码逻辑,你就可以知道,作为菜单/热插拔项目
private void myContextMenuStrip_Opening(object sender, CancelEventArgs e)
{
myContextMenuStrip.Items.Insert(3, myToolStripMenuItem);
}
ToolBar/ContextMenu被打开,它应该显示哪些项目。
我结束了实施SharedMenuItem
的职责是注册和更新需要更改的UI元素。上下文菜单不同,足以保证自己的处理程序。
而不是更新所有MenuItems我更新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;
}
}
有趣...显示/分享您的代码! :-) – 2010-12-04 07:08:25
“菜单从不同时显示”并不完全正确考虑到我们都有`Toolbar`归类用`Menu`和`ContextMenu`。 – Crisfole 2010-12-01 19:29:05