在Wpf项目目录中搜索用户控件并将它们作为对象引用

时间:2016-12-17 22:07:23

标签: wpf list loops types user-controls

好的,这可能是一个非常愚蠢的问题,基本上我要做的是动态地将我的项目中的所有用户控件添加到List<UserControl>

所以说在我的IDE中我创建了2个名为 view1.xaml view2.xaml 的用户控件,并在名为 GetAllViews的方法中创建了)我想查找项目中的任何文件,从单词 view 开始(或者更好地包含 view * .xaml )并将它们添加到{ {1}}。

List<UserControl>

所以我基本上想避免创建一个巨大的可见用户控件列表并实例化它们,然后逐个将它们添加到列表中,当我可以循环并从找到的控件中实例化它们然后将它们添加到列表,有意义吗?

也许我在这种情况下以错误的方式思考任何建议?

更新 添加更多代码以获得更好的上下文...

在我的MainWindow.xaml.cs中,我调用 GetAllViews()方法来填充列表

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

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

然后在btnNext_Click

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

与btnBack_click

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

所以基本上这就是我要做的事情:

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

    }

1 个答案:

答案 0 :(得分:2)

  

我想查找项目中的任何文件,从单词视图开始(或者更好地包含视图* .xaml)并将它们添加到列表中。

在构建应用程序时,XAML文件将编译为BAML资源。以下方法应该为您提供List&lt; UserControl&gt;名为“view * .xaml”的所有UserControls位于项目的根文件夹中:

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

但是,由于UserControl只是类,您应该在编译时知道所有UserControl的名称,并且能够自己“手动”创建列表,例如:

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

在我看来,结果将是相同的,后一种方法将是一个更好的解决方案。它更容易,更快速,更不容易出错。但我想你有理由做你想做的事。