2016-12-17 84 views
1

好了,所以這可能是一個非常非常愚蠢的問題,基本上,我試圖做我的項目是動態地添加所有的用戶控件的一個List<UserControl>搜索用戶控件和引用它們爲對象

所以在我的IDE說我創建第2個view1.xamlview2.xaml用戶控件,並命名方法內部GetAllViews()我想看看以單詞在我的項目的任何文件查看(或更好的還包含查看* .xaml)並添加它們到List<UserControl>

public List<UserControl> viewList = new List<UserControl>(); 

public void GetAllViews() 
     { 
      view1 v1 = new view1(); 
      view2 v2 = new view2(); 
      viewList.Add(v1); 
      viewList.Add(v2); 
     } 

所以我基本上要避免創建用戶控制的巨大可見名單和實例化它們,然後一個接一個,當我可以只循環並把它們添加到列表,實例化它們從發現的控制則將它們添加到列表中,是否有意義?

也許我在想這個錯誤的方式,在這種情況下,有什麼建議?

UPDATE: 添加更多的代碼爲更好的背景下...

在我MainWindow.xaml.cs我打電話GetAllViews()方法來填充列表

#region MEMBER VARIABLES 

     UtilityFactory uf = new UtilityFactory(); 
     int _currentView = 0; 
     int _previousView = 0; 

     #endregion 


    #region PROPERTIES 

    List<UserControl> ViewList 
    { 
     get 
     { 
      return uf.viewList; 
     } 
    } 

    #endregion 

public MainWindow() 
    {   
     InitializeComponent(); 
     softRendering(); 
     uf.GetAllViews();    
     pageTransition.ShowPage(ViewList[_currentView]); 
    } 

然後在btnNext_Click

private void btnNext_Click(object sender, RoutedEventArgs e) 
    {   
     if (_currentView < ViewList.Count - 1) 
     { 
      _previousView = _currentView; 
      _currentView += 1; 
      pageTransition.ShowPage(ViewList[_currentView]); 
     }              
    } 

而基本上反對伊特爲btnBack_click

private void btnBack_Click(object sender, RoutedEventArgs e) 
    { 
     if (_currentView != 0) 
     { 
      _currentView = _previousView; 
      _previousView += 1; 
      pageTransition.ShowPageFromLeft(ViewList[_currentView]); 
     } 

    } 

所以基本上這就是我希望做的:

public void GetAllViews2() 
     { 
      foreach (var uControls in uControlList) 
      { 
       uControls newControl = uControls(); 
       viewList.Add(newControl); 
      } 
     } 
+0

UserControl不過是一個類。爲什麼要將UserControls的實例添加到列表中?你如何使用這個列表進行indending?運行時沒有XAML「文件」的概念。你的XAML文件被編譯成資源。 – mm8

+0

沒錯,但是我怎麼能從我找到的文件(類)列表中創建一個對象(類對象)?我正在使用該列表在窗口中的頁面之間切換。因此,如果用戶點擊「下一步」按鈕,我可以引用列表的索引以進入下一頁,或反之亦然「後退」按鈕。從我可以告訴我,如果我希望它是動態的,我需要有指數來實現這一點。 – ganjeii

+0

您無法將用戶控件添加到列表中,而無需首先實例化UC,因此我不確定是否瞭解您在此嘗試執行的目的。 – mm8

回答

2

我要尋找我的項目以單詞視圖中的任何文件(或更好,但包含視圖* .xaml)並將它們添加到列表中。

當您構建應用程序時,XAML文件被編譯爲BAML資源。下面的方法應該讓你列表<用戶控件命名爲「視*的.xaml」這是位於項目的根文件夾的所有用戶控件的>:

private List<UserControl> GetUserControls() 
{ 
    List<UserControl> userControls = new List<UserControl>(); 
    System.Reflection.Assembly assembly = System.Reflection.Assembly.GetEntryAssembly(); 
    string resourceName = assembly.GetName().Name + ".g.resources"; 
    using (var stream = assembly.GetManifestResourceStream(resourceName)) 
    using (var reader = new System.Resources.ResourceReader(stream)) 
    { 
     foreach (System.Collections.DictionaryEntry entry in reader) 
     { 
      string key = entry.Key.ToString(); 
      if (key.StartsWith("view") && key.EndsWith(".baml")) 
      { 
       System.IO.Stream bamlStream = entry.Value as System.IO.Stream; 
       if (bamlStream != null) 
       { 
        using (System.Windows.Baml2006.Baml2006Reader bamlReader = new System.Windows.Baml2006.Baml2006Reader(bamlStream)) 
        { 
         userControls.Add(System.Windows.Markup.XamlReader.Load(bamlReader) as UserControl); 
        } 
       } 
      } 
     } 
    } 
    return userControls; 
    } 
} 

但由於用戶控件是什麼,但你應該知道的類所有的用戶控件在編譯時的名字,只是能夠「手動」創建列表自己,如:

List<UserControl> ucs = new List<UserControl>(); 
ucs.Add(new view1()); 
ucs.Add(new view2()); 
... 

結果將是相同的,而後者的做法是在我看來,一個更好的解決方案。它既簡單又快捷,並且不易出錯。但我想你有你做你想做什麼的理由。

+0

廢話,幹得好先生。那麼我今天肯定會學到一些新東西。我認爲必須閱讀條目並將其轉換爲我需要的類型。你把它釘在頭上。我同意這種簡單的方法可能是正確的。我的推理很簡單,如果我添加另一個view.xaml類到項目中,我不必輸入更多的代碼將它添加到列表'ucs.Add(new view3());'etc ...例如。可能是一個愚蠢的推理,但我很好奇。非常感謝您的回答! – ganjeii

+0

添加另一個「添加」行比添加新的UserControl本身更省力:) – mm8

+0

好吧,不是真的,因爲我必須創建一個用戶控件,並用名稱保存.... ** view3.xaml **然後我完成了...不要成爲一個debbie downer – ganjeii

相關問題