XamlReader.Load()的奇怪行为?

时间:2012-02-25 16:26:01

标签: c# .net wpf xaml

解析外部XAML文件时,我遇到了一个非常奇怪的问题。前历史记录是我想要加载带有要处理的内容的外部XAML文件。但我想加载尽可能多的不同文件。这是通过卸载旧的并加载新的来实现的。

我的问题是: 当我第一次加载一个xaml时,一切都很好,一切都应该如此。 但是当我第二次加载相同的xaml时,加载对象的每个条目都有两次。如果我再次运行它,每个对象都有三次,依此类推......

要自行调试项目,请下载here。该函数从文件“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读取的对象,并且在输出中没有任何childelement ...但是如果我将对象拉出字典,那么孩子们都在那里(重复和三重,但那里)。

我已经尝试清除

列表
topics.Clear();

topics=new ObservableCollection<TopicListItem>();
lv_topics.ItemsSource=topics;

2 个答案:

答案 0 :(得分:1)

Index.Topics.Clear()加载到您的主题对象后尝试Topics。这似乎摆脱了重复。

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

答案 1 :(得分:0)

在代码帖子中,主题未在LoadPresentation()中声明,因此它自然会有任何先前的值。

我知道你说过你尝试过的话题=新的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块;看看有没有奇怪的事情发生。