0

我有ToolStrip一个ContextMenu,像这样:

我的资源中有 2 个图标,如下所示:

我正在尝试将图标切换为 16x16 对应的图标:

void largeIconsToolStripMenuItem_Click(object sender, EventArgs e)
{
    var ContextItem = (ToolStripMenuItem) sender;
    var ContextMenu = (ContextMenuStrip) ContextItem.Owner;
    var ToolStrip = (ToolStrip) ContextMenu.SourceControl;
    var Checked = ContextItem.Checked;

    ToolStrip.ImageScalingSize = Checked ? new Size(32, 32) : new Size(16, 16);

    foreach(ToolStripButton Button in ToolStrip.Items)
        Button.Image = Resources.t_new16;
}

这可行,但我不想foreach为每个单独的图标添加新行。如何将资源名称替换t_icon16为当前所在的位置t_icon32

我试图在 中寻找一Name处房产Button.Image,但没有一处。

我也试过:

foreach(ToolStripButton Button in ToolStrip.Items)
    foreach(PropertyItem P in Button.Image.PropertyItems)
        MessageBox.Show(P.Id.ToString() + " - " + P.Value.ToString());

但是没有MessageBox显示es。

如何动态交换资源图像?

4

2 回答 2

1

创建两个图像列表 - 一个带有小图标,另一个带有大图标(按相同顺序):

toolStrip.ImageList = smallImageList;
toolStripButton1.ImageIndex = 0;
toolStripButton2.ImageIndex = 1;

只需在列表之间切换:

toolStrip.ImageList = largeImageList;
于 2013-07-04T13:44:59.023 回答
0

我设法做到了这一点,而不必维护 2 个图像列表。

首先,ToolStripButton需要将其Tag属性设置为初始资源的名称:

使用该设置,此代码将动态处理其余部分:

void largeIconsToolStripMenuItem_Click(object sender, EventArgs e)
{
    var ResourceManager = new ResourceManager(typeof(Resources));
    var ContextItem = (ToolStripMenuItem) sender;
    var ContextMenu = (ContextMenuStrip) ContextItem.Owner;
    var ToolStrip = (ToolStrip) ContextMenu.SourceControl;
    var Checked = ContextItem.Checked;

    ToolStrip.ImageScalingSize = Checked ? new Size(32, 32) : new Size(16, 16);

    foreach(ToolStripButton Button in ToolStrip.Items)
    {
        var CurrentResource = Button.Tag.ToString();
        var NewResource = CurrentResource.Substring(0, CurrentResource.Length - 2) + (Checked ? "32" : "16");
        Button.Image = (Image) ResourceManager.GetObject(NewResource);
        Button.Tag = NewResource;
    }
}
于 2013-07-04T14:40:36.573 回答