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&lt;IOutputDevicePlugin&gt;:

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 个参数的构造函数

EventArgs 不包含采用 1 个参数的构造函数

CS1729 'MyNavigationPage' 不包含采用 1 个参数的构造函数 --> 在 Visual Studio 2019 社区版中

C#编程中,出现 不包含采用“2”参数的构造函数的错误 怎么改?

收到“未定义无参数构造函数”错误,不知道为啥

HttpGetAttribute不包含带有1个参数的构造函数