You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms中ToolStripMenuItem.Checked属性无法设置的问题

C#音乐播放器右键播放列表菜单勾选状态问题

我用C#开发了一款音乐播放器,目前只剩一个问题:右键点击曲目弹出的播放列表ContextMenuStrip,需要实现当音乐已在对应播放列表中时,ToolStripMenuItem处于勾选状态;不在则不勾选。注意:这些菜单项是用户右键点击音乐时动态添加的。

我尝试过的解决方案:

  • 修改渲染模式,无任何效果
  • 尝试通过方法强制勾选复选框,仍无效
  • 尝试用普通代码行强制勾选,无效
  • 更换勾选菜单项的方法,还是没用

相关代码如下:

public static void PlaylistsOpening(object sender, CancelEventArgs e, object instance, AudioFileInfo music)
{
    if (instance is Form1 form1)
    {
        if (form1.cmsPlaylists.InvokeRequired)
        {
            form1.cmsPlaylists.Invoke(new MethodInvoker(delegate { form1.cmsPlaylists.Items.Clear(); }));
        }
        else
        {
            form1.cmsPlaylists.Items.Clear();
        }

        Debug.WriteLine(sender.GetType().Name);
        IEnumerable<Playlist> playlists = Playlist.GetAllPlaylists();
        Debug.WriteLine(playlists.Count());
        foreach (Playlist playlist in playlists.ToList())
        {

            ToolStripMenuItem item = new ToolStripMenuItem
            {
                Tag = playlist,
                Text = playlist.Name
            };

            if (Playlist.GetPlaylistsWithAudioFile(music).Contains(playlist))
            {
                Debug.WriteLine("Contains");
                item.Checked = true;
            }

            item.Click += delegate
            {
                Debug.WriteLine("Clicked");
                var nItem = form1.cmsPlaylists.GetItemsFromTag(playlist)[0];
                if (nItem.CheckState == CheckState.Checked)
                {
                    Debug.WriteLine("Checked");
                    music.RemoveFromPlaylist((Playlist)nItem.Tag);
                    nItem.CheckState = CheckState.Unchecked;
                }
                else
                {
                    Debug.WriteLine("Unchecked");
                    music.AddToPlaylist((Playlist)nItem.Tag);
                    nItem.CheckState = CheckState.Checked;
                }
            };
            music.Volume = form1.SoundVolume;

            form1.cmsPlaylists.Items.Add(item);
        }
                
        if (form1.cmsPlaylists.InvokeRequired)
        {
            ToolStripMenuItem item = new ToolStripMenuItem()
            {
               Text = "Create a new playlist..."
            };

            item.Click += delegate
            {
                using (DialogPlaylist dialogPlaylist = DialogPlaylist.CreatePlaylist())
                {
                    if (dialogPlaylist.ShowDialog() == DialogResult.OK)
                    {
                        form1.cmsPlaylists.Invoke(new MethodInvoker(delegate
                        {
                            ToolStripMenuItem nItem = new ToolStripMenuItem
                            {
                                Text = dialogPlaylist.Tag.Name,
                                Tag = dialogPlaylist.Tag,
                                CheckOnClick = true,
                                Checked = true
                            };

                            nItem.Click += delegate
                            {
                                if (nItem.Checked)
                                {
                                    music.RemoveFromPlaylist((Playlist)nItem.Tag);
                                }
                                else
                                {
                                    music.AddToPlaylist((Playlist)nItem.Tag);
                                        }
                                    };

                                    form1.cmsPlaylists.Items.Add(nItem);
                                }));
                            }
                        }
                    };
                }
                else
                {
                    void AddPlaylist(object sender1, EventArgs e1)
                    {
                        using (DialogPlaylist dialogPlaylist = DialogPlaylist.CreatePlaylist())
                        {
                            if (dialogPlaylist.ShowDialog() == DialogResult.OK)
                            {
                                ToolStripMenuItem nItem = new ToolStripMenuItem()
                            {
                            Text = dialogPlaylist.Tag.Name,
                            Tag = dialogPlaylist.Tag,
                            CheckOnClick = true,
                            Checked = true
                        };

                        nItem.Click += delegate
                        {
                            if (nItem.Checked)
                            {
                                music.RemoveFromPlaylist((Playlist)nItem.Tag);
                            }
                            else
                            {
                                music.AddToPlaylist((Playlist)nItem.Tag);
                            }
                        };

                        form1.cmsPlaylists.Items.Add(nItem);
                    }
                }
            }

            ToolStripMenuItem item = new ToolStripMenuItem()
            {
                Text = "Create a new playlist..."
            };

            item.Click += (s, e2) => AddPlaylist(s, e2);

            form1.cmsPlaylists.Items.Add(item);
        }
    }
    else
    {
        return;
    }
}

调用方式:

private void PlaylistsContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
    Debug.WriteLine("Opening...");
    MusicPlayer.Events.PlaylistsOpening(sender, e, this, currentFile);
}

内容的提问来源于stack exchange,提问作者Error404

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:07:55