代码之家  ›  专栏  ›  技术社区  ›  mmmm

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

  •  0
  • mmmm  · 技术社区  · 14 年前

    我很喜欢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);
                }
    

    这些标签是页面,所以我可能做的完全错误,任何帮助都会被感激。

    提前谢谢

    4 回复  |  直到 14 年前
        1
  •  1
  •   Robaticus    14 年前

    没有智能感知,但我认为您需要将项目的内容设置为您的页面。类似:

        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);
        }
    
        2
  •  0
  •   Reed Copsey    14 年前

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

    然后你会使用 [ImportMany] 导入页面集合,并为每个导入的页面构建一个“选项卡”。

        3
  •  0
  •   Ray Burns    14 年前

    只需将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”循环。

        4
  •  0
  •   mmmm    14 年前

    我解决了我的问题,页面只能有框架作为它们的父母,所以添加这个代码可以解决这个问题。

                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);
                }