2012-02-25 21 views
1

外部XAMLファイルの解析中に非常に奇妙な問題が発生しました。事前の歴史は、処理するコンテンツを含む外部XAMLファイルをロードすることです。しかし、私が望むだけ多くのファイルをロードしたい。それは古いものをアンロードして、新しいものをロードすることによって起こります。XamlReader.Load()の異常な動作?

私の問題は次のとおりです。 初めてxamlを読み込むと、すべてがうまくいっています。 しかし、2回目に同じxamlを読み込むと、オブジェクトim Loadingのすべてのエントリが2回あります。私がこれをもう一度実行すると、すべてのオブジェクトがそこに3回あります。

プロジェクトを自分でデバッグするには、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をして読まれなかったオブジェクトをシリアル化しようとしてい

...しかし、私は辞書のうち、対象物を引く場合は、子どもたちすべてがそこにあります(重複して3倍ですが、そこにあります)。私はすでにコードポストのトピックで

topics.Clear(); 

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

答えて

1

Topicsをトピックオブジェクトに読み込んだ後にIndex.Topics.Clear()を試してください。それは重複を取り除くように見えます。

+0

はい、それは、ありがとう、それを解決しました。しかし、なぜ?私はそれらのオブジェクトが一緒にリンクされている理由を理解していません... – CShark

+0

あなたに答えるために、私はなぜわかりません。私はあなたのコードを約1時間演奏して、自分が何をしたのかを判断しました。私はトピックの正しい数を持っていたXamlReader.Loadを削除しました。プレゼンテーションをTopicListにキャストするとすぐに余分なトピックが表示されていました。私はそれがあなたのTopicListタイプの静的宣言と関係があると推測しています。それをヌルに設定してから再割り当てすると、古いデータとバックアップを接続することができます。 –

+0

静的なDependencyPropertyは、バインディングを処理する通常の方法ではありませんか?もしそうなら、最初に表示されるはずのトピックがありますか?私はこのバグを他のいくつかの人々に示しました。彼らの最終的な意見は、.NET Frameworkにバグがあることです。私はこれを再現し、より多くの情報を収集しようとします... – CShark

0

上でリストをクリアしようとしてい

は(LoadPresentationで宣言されていない)ので、当然それはどんな前の値を持つことになります。

私は、あなたがトピック=新しいObservableCollection()を試してみたとお知りします。もう一度お試しください。そして、私は、ファイル名

public void LoadPresentation(string fileName) 

を渡す、IN LoadPresentation()

public void LoadPresentation() 
    { 
     ObservableCollection<TopicListItem> topics = new ObservableCollection<TopicListItem>() 

ことを入れて、私はあなたがLoadPresentation外のトピックを使用する必要がありますが、これは、デバッグされ得ます。それを返す以外のトピックが必要な場合。それはそれを修正しない場合

public ObservableCollection<TopicListItem> LoadPresentation(string fileName) 

I)は、(XAML_file.Close上のtry catchブロックを置きます。奇妙なことが起こっていないかどうかを確認してください。

+0

あなたが最後に投稿を読んでいたら、すでに他の一般的な方法でリストをクリアしようとしたことがわかります。 – CShark

+0

明らかに、Index.Topics.Clear()を試していないので、すべてのオプションを使い果たしていませんでした。あなたの記事によると、あなたはトピックLoadPresentation()を宣言しようとしていませんでした。 – Paparazzi

+0

ああ。今私はあなたが何をしているか知っています:Index.Topicsをクリアする。申し訳ありませんが、私は理解していませんでした。 – CShark