XamlReader.Load()的奇怪行为
本文关键字:Load XamlReader | 更新日期: 2023-09-27 18:25:51
解析外部XAML文件时遇到一个非常奇怪的问题。以前的历史是,我想加载一个外部XAML文件,其中包含要处理的内容。但我想加载尽可能多的不同文件。这是通过卸载旧的和装载新的来实现的。
我的问题是:当我第一次加载xaml时,一切都很好,一切都是应该的。但是当我第二次加载相同的xaml时,对象im Loading的每个条目都在那里两次。如果我再运行一次,每个对象都在那里三次,以此类推…
要自己调试项目,请在此处下载。该函数从文件"Control Panel.xaml.cs"的第137行开始。我真的不知道这是什么。是我的错还是只是一个错误?如果是,是否有解决方法?
/// <summary>
/// Load a xaml file and parse it
/// </summary>
public void LoadPresentation()
{
this.Title = "Control Panel - " + System.IO.Path.GetFileName(global.file);
System.IO.FileStream XAML_file = new System.IO.FileStream(global.file, System.IO.FileMode.Open);
try
{
System.IO.StreamReader reader = new System.IO.StreamReader(XAML_file);
string dump = reader.ReadToEnd(); //This is only for debugging purposes because of the strange issue...
XAML_file.Seek(0, System.IO.SeekOrigin.Begin);
presentation = (ResourceDictionary)XamlReader.Load(XAML_file);
//Keys the resourceDictionary must have to be valid
if (presentation["INDEX"] == null || presentation["MAIN_GRID"] == null || presentation["CONTAINER"] == null || presentation["LAYOUTLIST"] == null)
{
throw new Exception();
}
//When this list is loaded, every item in it is there twice or three times or four... Why????
TopicList Index = null;
Index = (TopicList)presentation["INDEX"];
for (int i = 0; i < topics.Count; )
{
topics.RemoveAt(i);
}
foreach (TopicListItem item in Index.Topics)
{
topics.Insert(item.TopicIndex, (Topic)presentation[item.ResourceKey]);
}
lv_topics.SelectedIndex = 0;
selectedIndex = 0;
}
catch
{
System.Windows.Forms.MessageBox.Show("Failed to load XAML file '"" + global.file + "'"", "Parsing Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
presentation = null;
}
finally
{
XAML_file.Close();
}
}
编辑:
我试图序列化从XamlReader读取的对象,但输出中没有任何子元素。。。但如果我把这个对象从字典里拿出来,孩子们都在那里(重复和三次,但都在那里)。
我已经尝试通过清除列表
topics.Clear();
和
topics=new ObservableCollection<TopicListItem>();
lv_topics.ItemsSource=topics;
在将Topics
加载到主题对象后尝试Index.Topics.Clear()
。这似乎消除了重复。
//When this list is loaded, every item in it is there twice or three times or four... Why????
TopicList Index = null;
Index = (TopicList)presentation["INDEX"];
topics.Clear();
foreach (TopicListItem item in Index.Topics)
{
topics.Insert(item.TopicIndex, (Topic)presentation[item.ResourceKey]);
}
Index.Topics.Clear(); //Adding this will prevent the duplication
lv_topics.SelectedIndex = 0;
selectedIndex = 0;
在代码中,帖子主题没有在LoadPresentation()中声明,因此它自然会有任何先前的值。
我知道你说过你尝试过topics=new ObservableCollection();但是请再试一次。并将其放入LoadPresentation()
public void LoadPresentation()
{
ObservableCollection<TopicListItem> topics = new ObservableCollection<TopicListItem>()
我会传递文件名
public void LoadPresentation(string fileName)
我知道您可能需要使用LoadPresentation之外的主题,但这是调试。如果你需要主题以外的返回它。
public ObservableCollection<TopicListItem> LoadPresentation(string fileName)
如果这还不能解决问题,我会在XAML_file.Close()上放一个try-catch块;看看是否有什么奇怪的事情没有发生。