Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Wpf项目目录中搜索用户控件并将其作为对象引用_Wpf_List_Loops_Types_User Controls - Fatal编程技术网

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

在Wpf项目目录中搜索用户控件并将其作为对象引用,wpf,list,loops,types,user-controls,Wpf,List,Loops,Types,User Controls,好的,这可能是一个非常愚蠢的问题,基本上我正在尝试做的是动态地将项目中的所有用户控件添加到列表中 因此,假设在我的IDE中,我创建了两个名为view1.xaml和view2.xaml的用户控件,在名为GetAllViews()的方法中,我希望在我的项目中查找以word view开头的任何文件(或者更好的是包含view*.xaml),并将它们添加到列表中 所以本质上这就是我想要做的: public void GetAllViews2() { foreach

好的,这可能是一个非常愚蠢的问题,基本上我正在尝试做的是动态地将项目中的所有用户控件添加到
列表中

因此,假设在我的IDE中,我创建了两个名为view1.xaml和view2.xaml的用户控件,在名为GetAllViews()的方法中,我希望在我的项目中查找以word view开头的任何文件(或者更好的是包含view*.xaml),并将它们添加到
列表中

所以本质上这就是我想要做的:

public void GetAllViews2()
        {
            foreach (var uControls in uControlList)
            {
                uControls newControl = uControls();
                viewList.Add(newControl);
            }
        }
我想在我的项目中查找以单词view(或者更好的是包含view*.xaml)开头的任何文件,并将它们添加到列表中

当您构建应用程序时,XAML文件被编译到BAML资源中。以下方法应为您获取位于项目根文件夹中名为“view*.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;
    }
}
private List GetUserControls()
{
List userControls=new List();
System.Reflection.Assembly Assembly=System.Reflection.Assembly.GetEntryAssembly();
字符串resourceName=assembly.GetName().Name+“.g.resources”;
使用(var stream=assembly.GetManifestResourceStream(resourceName))
使用(var reader=newsystem.Resources.ResourceReader(流))
{
foreach(读卡器中的System.Collections.DictionaryEntry条目)
{
string key=entry.key.ToString();
if(key.StartsWith(“视图”)&key.EndsWith(“.baml”))
{
System.IO.Stream bamlStream=条目.Value作为System.IO.Stream;
如果(bamlStream!=null)
{
使用(System.Windows.Baml2006.Baml2006Reader-bamlReader=new System.Windows.Baml2006.Baml2006Reader(bamlStream))
{
添加(System.Windows.Markup.XamlReader.Load(bamlReader)作为用户控件);
}
}
}
}
}
返回用户控件;
}
}
但是,由于UserControl只是类,因此您应该在编译时知道所有UserControl的名称,并且能够自己“手动”创建列表,例如:

List<UserControl> ucs = new List<UserControl>();
ucs.Add(new view1());
ucs.Add(new view2());
...
List ucs=new List();
添加(新视图1());
添加(新视图2());
...

结果将是相同的,在我看来,后一种方法将是更好的解决方案。它既简单又快速,而且不容易出错。但是我想你做你想做的事情是有原因的。

用户控件只是一个类。为什么要将UserControls的实例添加到列表中?您打算如何使用此列表?在运行时没有XAML“文件”的概念。您的XAML文件将被编译到resources.right中,但是如何从找到的文件(类)列表中创建对象(类对象)?我正在使用列表在窗口中的页面之间切换。因此,如果用户单击“下一步”按钮,我可以引用列表的索引以转到下一页,或者使用“上一步”按钮。据我所知,如果我希望它是动态的,我需要有索引来实现这一点。如果不先实例化UC,就无法将UserControl添加到列表中,因此我不确定我是否理解您在这里尝试的目的。我想找到我创建的所有UserControl,然后动态地恢复它们并将它们添加到同一循环的列表中。天哪,干得好,先生。我今天确实学到了一些新东西。我在想必须读取条目并将其转换为我需要的类型。你把它钉在头上了。我同意更简单的方法可能是正确的。我的理由很简单,如果我将另一个view.xaml类添加到项目中,我就不必键入更多的代码来将其添加到列表
ucs.add(new view3())等。。。例如可能是一个愚蠢的推理,但我很好奇。非常感谢你的回答!添加另一个“Add”行比添加新的UserControl本身要省力:)其实不是这样,因为我必须创建一个用户控件并用名称保存它。。。。view3.xaml然后我就完成了。。。别像黛比一样沮丧
  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);
            }
        }
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());
...