在 Wpf 项目目录中搜索用户控件并将它们作为对象引用
Search user controls within Wpf Project Directory and Reference them as objects
好吧,这可能是一个非常愚蠢的问题,基本上我想做的是将我项目中的所有用户控件动态添加到 List<UserControl>
所以在我的 IDE 中说,我创建了 2 个名为 view1.xaml 和 view2.xaml[= 的用户控件43=],在一个名为 GetAllViews() 的方法中,我想在我的项目中查找以单词 view(或更好的还包含 view*.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);
}
所以我基本上想避免创建一个巨大的用户控件可见列表并实例化它们,然后将它们一个一个地添加到列表中,当我可以循环遍历并从找到的控件实例化它们然后添加它们时上榜,有意义吗?
也许我考虑的方式不对,在这种情况下,有什么建议吗?
更新:
添加更多代码以获得更好的上下文...
在我的 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);
}
}
I want to look for any files in my project starting with the word view (or better yet containing view*.xaml) and add them to the List.
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;
}
}
但是由于 UserControl 只是 类 你应该在编译时知道所有 UserControls 的名称并且能够自己创建列表 "manually",例如:
List<UserControl> ucs = new List<UserControl>();
ucs.Add(new view1());
ucs.Add(new view2());
...
结果是一样的,在我看来,后一种方法是更好的解决方案。它既更容易、更快捷,也更不容易出错。但我想你有做你想做的事的理由。
好吧,这可能是一个非常愚蠢的问题,基本上我想做的是将我项目中的所有用户控件动态添加到 List<UserControl>
所以在我的 IDE 中说,我创建了 2 个名为 view1.xaml 和 view2.xaml[= 的用户控件43=],在一个名为 GetAllViews() 的方法中,我想在我的项目中查找以单词 view(或更好的还包含 view*.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);
}
所以我基本上想避免创建一个巨大的用户控件可见列表并实例化它们,然后将它们一个一个地添加到列表中,当我可以循环遍历并从找到的控件实例化它们然后添加它们时上榜,有意义吗?
也许我考虑的方式不对,在这种情况下,有什么建议吗?
更新: 添加更多代码以获得更好的上下文...
在我的 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);
}
}
I want to look for any files in my project starting with the word view (or better yet containing view*.xaml) and add them to the List.
XAML 文件在您构建应用程序时被编译到 BAML 资源中。以下方法应该为您提供一个列表
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 只是 类 你应该在编译时知道所有 UserControls 的名称并且能够自己创建列表 "manually",例如:
List<UserControl> ucs = new List<UserControl>();
ucs.Add(new view1());
ucs.Add(new view2());
...
结果是一样的,在我看来,后一种方法是更好的解决方案。它既更容易、更快捷,也更不容易出错。但我想你有做你想做的事的理由。