Panel 不包含采用 0 个参数的构造函数
Posted
技术标签:
【中文标题】Panel 不包含采用 0 个参数的构造函数【英文标题】:Panel does not contain a constructor that takes 0 arguments 【发布时间】:2014-03-18 01:28:23 【问题描述】:我需要在 Form1.cs 内的 panel1 中加载一个 User Control,问题是 UserControl (AudioPlaybackPanel ) 包含一个 ImportingConstructor ([ImportMany]IEnumerable),我不知道应该在 Form1 AudioPlaybackPanel 中有哪两个参数(??????)。
我得到的错误是:“NAudio.App.AudioPlaybackPanel”不包含采用 0 个参数的构造函数
这里是 Form1.cs
namespace NAudio.App
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void panel1_Paint(object sender, PaintEventArgs e)
private void button1_Click(object sender, EventArgs e)
AudioPlaybackPanel myPanel = new AudioPlaybackPanel(????);
panel1.Controls.Add(myPanel);
这是我的用户控制面板 (AudioPlaybackPanel.cs):
namespace NAudio.App
[Export]
public partial class AudioPlaybackPanel : UserControl
private IWavePlayer waveOut;
private string fileName = null;
private WaveStream fileWaveStream;
private Action<float> setVolumeDelegate;
[ImportingConstructor]
public AudioPlaybackPanel([ImportMany]IEnumerable<IOutputDevicePlugin> outputDevicePlugins)
InitializeComponent();
LoadOutputDevicePlugins(outputDevicePlugins);
[ImportMany(typeof(IInputFileFormatPlugin))]
public IEnumerable<IInputFileFormatPlugin> InputFileFormats get; set;
private void LoadOutputDevicePlugins(IEnumerable<IOutputDevicePlugin> outputDevicePlugins)
comboBoxOutputDevice.DisplayMember = "Name";
comboBoxOutputDevice.SelectedIndexChanged += new EventHandler(comboBoxOutputDevice_SelectedIndexChanged);
foreach (var outputDevicePlugin in outputDevicePlugins.OrderBy(p => p.Priority))
comboBoxOutputDevice.Items.Add(outputDevicePlugin);
comboBoxOutputDevice.SelectedIndex = 0;
void comboBoxOutputDevice_SelectedIndexChanged(object sender, EventArgs e)
panelOutputDeviceSettings.Controls.Clear();
Control settingsPanel;
if (SelectedOutputDevicePlugin.IsAvailable)
settingsPanel = SelectedOutputDevicePlugin.CreateSettingsPanel();
else
settingsPanel = new Label() Text = "This output device is unavailable on your system", Dock=DockStyle.Fill ;
panelOutputDeviceSettings.Controls.Add(settingsPanel);
private IOutputDevicePlugin SelectedOutputDevicePlugin
get return (IOutputDevicePlugin)comboBoxOutputDevice.SelectedItem;
// The rest of the code continues from here on...
界面如下:
namespace NAudio.App
public interface IOutputDevicePlugin
IWavePlayer CreateDevice(int latency);
UserControl CreateSettingsPanel();
string Name get;
bool IsAvailable get;
int Priority get;
为了以防万一,这里有一个插件:
DirectSoundOutPlugin.cs
namespace NAudio.App
[Export(typeof(IOutputDevicePlugin))]
class DirectSoundOutPlugin : IOutputDevicePlugin
private DirectSoundOutSettingsPanel settingsPanel;
private bool isAvailable;
public DirectSoundOutPlugin()
this.isAvailable = DirectSoundOut.Devices.Count() > 0;
public IWavePlayer CreateDevice(int latency)
return new DirectSoundOut(settingsPanel.SelectedDevice, latency);
public UserControl CreateSettingsPanel()
this.settingsPanel = new DirectSoundOutSettingsPanel();
return this.settingsPanel;
public string Name
get return "DirectSound";
public bool IsAvailable
get return isAvailable;
public int Priority
get return 3;
请帮忙!
【问题讨论】:
在IOutputDevicePlugin.cs文件中设置,实现不同类型的“插件” 我刚刚添加了一个插件@GrantWinney 我删除了我的答案,因为我意识到您很可能会尝试根据自己的喜好修改 NAudioDemo 应用程序:github.com/SjB/NAudio/tree/master/NAudioDemo 我正确吗? @AJ152 如果您从一开始就向我们提供详细信息,将会非常有帮助。 对不起,我通常尽量不要发布太多代码以免让它太长,但其他人“问”所以我添加了它。但如果您仍然可以提供帮助,我将不胜感激。 【参考方案1】:错误并没有说它需要两个参数......它只是说它不需要 0。
构造函数需要一个参数 - IEnumerable<IOutputDevicePlugin>
:
public AudioPlaybackPanel([ImportMany]IEnumerable<IOutputDevicePlugin> outputDevicePlugins)
...
您需要找到实现IOutputDevicePlugin
接口的东西并传递它的集合,即使它只是一个空集合。 (将 null 传递给构造函数将允许它编译,但当您点击 LoadOutputDevicePlugins 中的循环时会引发运行时异常。)
考虑到您的问题的更新,这样的事情会让您启动并运行(尽管我怀疑传递一个空列表是否意味着非常多):
var myPanel = new AudioPlaybackPanel(new List<DirectSoundOutPlugin>());
panel1.Controls.Add(myPanel);
【讨论】:
【参考方案2】:值得一问,您是否真的需要从 NAudio 演示中完整复制 AudioPlaybackPanel.cs。它有这个构造函数的原因是它试图演示如何使用每一个 NAudio 的 IWavePlayer 实现。但在普通的实际应用程序中,您只需选择最适合您使用的应用程序。例如
this.waveOut = new WaveOut();
waveOut.Init(new AudioFileReader("my file.mp3");
waveOut.Play();
因此,如果您只想播放音频文件,则无需合并该特定演示中的插件架构。
【讨论】:
以上是关于Panel 不包含采用 0 个参数的构造函数的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET WebForms FriendlyUrlSegments 不包含采用 0 个参数的构造函数
CS1729 'MyNavigationPage' 不包含采用 1 个参数的构造函数 --> 在 Visual Studio 2019 社区版中