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
相关产品推荐
相关产品推荐

