使用MEF动态构建选项卡式应用程序

时间:2010-06-12 22:56:08

标签: wpf mef composition

我更倾向于使用MEF并计划使用它来构建一个演示应用程序来加载不同的标签。我是MEF和WPF的初学者,尽管MEF正在加载程序集,但我仍然坚持将控件加载到我创建的TabItem中。我的代码看起来像这样......

            foreach (var page in pages)
            {
                TabItem item = new TabItem();
                item.Header = page.PageTitle;

                /// Errm???

                // Add each page
                tcPageControl.Items.Add(item);
            }

标签是Pages,所以我可能完全错了,任何帮助都会受到赞赏。

提前致谢

4 个答案:

答案 0 :(得分:1)

没有intellisense方便,但我认为您需要将项目的内容设置为您的页面。类似的东西:

    foreach (var page in pages)
    {
        TabItem item = new TabItem();
        item.Header = page.PageTitle;

        item.Children.Add(page);
        //or item.Grid.Children.Add(page) or something like that.

        // Add each page
        tcPageControl.Items.Add(item);
    }

答案 1 :(得分:0)

这里没有太多细节 - 但基本的想法是[Export]每个“页面”,可能在一个自定义类中,为您提供页面标题等。

然后,您可以使用[ImportMany]导入一组页面,并为每个导入的页面构建一个“标签”。

答案 2 :(得分:0)

您只需将TabItem的Content属性设置为页面,如下所示:

foreach (var page in pages) 
{ 
  TabItem item = new TabItem(); 
  item.Header = page.PageTitle; 

  item.Content = page;

  tcPageControl.Items.Add(item); 
} 

使用LINQ编写它是一种更优雅的方式:

tcPageControl.ItemsSource =
  from page in pages
  select new TabItem
  {
    Header = page.PageTitle,
    Content = page,
  };

通常在WPF中,如果正确构造代码,就不必编写“foreach”循环。

答案 3 :(得分:0)

我解决了我的问题,Pages只能将Frames作为其父项,因此添加此代码可以解决它。

            foreach (var page in pages)
            {
                TabItem item = new TabItem();
                item.Header = page.PageTitle;

                // Now add some controls

                Frame frame = new Frame();

                frame.Content = page.View;

                item.Content = frame;

                // Add each page
                tcPageControl.Items.Add(item);

                //tcPageControl.Children.Add(view.Value);
            }