动态地在选项卡控件中启动用户控件

时间:2010-05-14 21:37:13

标签: c# wpf user-controls tabcontrol

我有一个自定义构建的菜单系统,我想在其中将用户控件从另一个项目加载到我的主项目的菜单控件(菜单控件)

用户控制项目:foobar 菜单系统项目:菜单

将它们加载到标签控件中的功能:

private void LaunchWPFApplication(string header, string pPath)
        {
            // Header - What loads in the tabs header portion.
            // pPath   - Page where to send the user

            //Create a new browser tab object
            BrowserTab bt = tabMain.SelectedItem as BrowserTab;
            bt = new BrowserTab();
            bt.txtHeader.Text = header;
            bt.myParent = BrowserTabs;

             //Load in the path 
        try
        {
            Type formType = Type.GetType(pPath, true);
            bt.Content = (UserControl)Activator.CreateInstance(formType);
        }
        catch
        {
            MessageBox.Show("The specified user control : " + pPath + " cannot be found");
        }

            //Add the browser tab and then focus            
            BrowserTabs.Add(bt);
            bt.IsSelected = true;
        }

我发送给函数的例子是:

LaunchWPFApplication("Calculater", "foobar.AppCalculater");

但每次运行时,应用程序都会抱怨formType为null。我很困惑如何加载用户控件和好奇,如果我发送正确的参数。

1 个答案:

答案 0 :(得分:1)

我遇到的问题是调用Type.GetType。 MSDN给出的通用调用是

Type formType = Type.GetType("AppCalculater");

哪些调用获取指定名称的类型。无论什么返回null,这仍然是。然后我将命名空间添加到混合中。

Type formType = Type.GetType("foobar.AppCalculater");

然而,这仍然在调用foobar中的其他项目文件时出错。为了在其他项目中获取用户控件,我在控件和命名空间调用之后添加了程序集。

Type formType = Type.GetType("foobar.AppCalculater,foobar");

然后,我能够使用此调用动态引用所有用户控件。因此,我现在更新的将另一个项目中的用户控件加载到我的选项卡控件中的调用如下:

private void LaunchWPFApplication(string header, string pPath)
        {
            // Header - What loads in the tabs top portion.
            // Path   - Page where to send the user

            //Create a new browser tab object
            BrowserTab bt = tabMain.SelectedItem as BrowserTab;
            bt = new BrowserTab();
            bt.txtHeader.Text = header;
            bt.myParent = BrowserTabs;

            //Load in the path 
            try
            {
                Type formType = Type.GetType(pPath); //Example "foobar.foobarUserControl,foobar"
                bt.Content = Activator.CreateInstance(formType);
            }
            catch (ArgumentNullException)
            {
                MessageBox.Show("The specified user control : " + pPath + " cannot be found");
            }
            catch (Exception ex)
            {
                MessageBox.Show("An error has occurred while loaded the specified user control : " + pPath + ". It includes the following message : \n" + ex);
            }
            //Add the browser tab and then focus     
            try
            {
                BrowserTabs.Add(bt);
            }
            catch(InvalidOperationException)
            {
                MessageBox.Show("Cannot add " + pPath + " into the tab control");
            }
            bt.IsSelected = true;
        }